#🌻 工作流使用
无需开发代码,即可快速创建工作流、表单,并完成审批、监控等操作。
#功能脑图
#特点
- 基于 Flowable(Activiti)生来具有的稳定工作流引擎。
- 使用flowable官方流程设计器,功能强大,操作熟悉。
- 支持流程导入导出,符合BPMN规范,中国式工作流。
- 在线流程表单设计器,免去繁琐的表单开发步骤。
- 支持流程发起、任务办理、保存、指定、追踪、退回、跳转、委托、转办、终止、挂起、加签、减签等功能。
- 任务退回支持退回到任意历史节点,兼容并行网关、子流程等。
- 任务审批支持指定下一审批人、任务期限、优先级等。
- 任务跳转可自由跳转到指定节点,满足特事特办的需求。
- 任务加签、减签可动态为会签、或签任务临时增加、减少签核人员。
- 任务委托可将任务委托给他人,他人办理完成后再回到委托人。
- 支持流程跟踪图,流程状态展现,流转信息,任务历史,任务分配信息。
- 支持表单挂载,全局表单,节点表单。
- 支持流程事件脚本在线编写,包括:流程启动、完成、取消;任务分配、创建、结束等。
- 支持智能提交,相同处理人自动跳过,自动完成第一个任务。
- 版本化管理流程,新调整的流程业务不影响正在运行,未结束的流程继续流转。
- 流程在线监控,运行中、已结束的流程掌控在手,可将运行中流程挂起、终止。
- 完善的审批记录机制,每一步审批操作都进行详实的记录。
后续计划
- 数据实体在线设计
- 数据实体与表单字段关联
- 完善的消息通知体制(催办、邮件、消息、短信通知等)
- 丰富表单设计器组件功能
- 其他
#一个完整的流程示例
#1. 创建一个流程分类
首先咱们先创建一个流程分类,对咱们新建的流程或表单进行归类。进入菜单:业务流程-> 分类管理,点击“新增分类”按钮,新建一个分类,数据如下:
name:分类名称
code:分类编码
注意:分类名称和分类编码均不可重复。
#2. 设计一个请假模型
进入菜单:业务流程-> 模型管理,点击“新增模型”按钮,新建一个模型,数据如下:
name: 模型名称
key: 模型键值
注意:键值不能重复,并且只能以下划线(_)或字母开头
模型创建完毕,进入到列表页面,点击刚才创建的【设计】按钮,进入到如下流程设计器页面。
接下来,我们按照如下步骤,设计上面的流程图。
#2.1.拖拽开始节点、任务节点、结束节点,并通过连接线连接。
#2.2.双击每一个节点,分别给他们取名字。
#2.3.点击第一个【填写申请单】的节点,选择,“分配用户”,在弹出框选择“流程发起人”。
#2.4.点击其他节点,选择“分配用户”,在弹出框选择分配给单个用户,分别给其他节点分配好任务办理人
#关于流程设计器中人员分配的说明:
在流程设计器中的“身份存储”选项卡,如图:
- 分配给流程发起人:顾名思义,即将该节点的办理人分配给流程发起人,本工作流功能已经实现提交申请自动将发起人信息设置到流程中,无需其他操作。
- 分配给单个用户:即将该节点的办理人分配给单个用户,分配给谁,谁就会收到待办任务。
- 候选用户:即将该节点的办理人分配给多个用户,比如:把某节点的办理人分配给张三和李四,则他们俩都会收到待办任务,其中一人办理完成,则任务消失。
- 候选组:即将该节点的办理人分配给一个或多个角色,比如:把某节点的办理人分配给“部门经理”这个角色,则拥有这个角色的人都会收到待办任务,其中一人办理完成,则任务消失。
在流程设计器中的“固定值”选项卡,如图:
我们可能会遇到这种情况,比如,我根本不知道该节点的办理人应该是具体的哪个人,他是动态的,怎么办呢?使用下面的方式即可解决这个问题
- 分配:即分配给单个人,此处填写${xxx}格式的流程变量,其中xxx为变量,值是用户的id。比如:${leader},那么leader这个变量从哪里来呢,我们可以在流程启动时, 让流程自动执行一个脚本,获取当前用户的leader,并设置到变量,则流程运行至本节点时,leader就会收到待办任务。
关于脚本的说明,请见后面第4节:编写一个groovy脚本。
-
候选用户:即分配给多个人,跟上面一条一样也是变量,值分别为用户的id,不过他可以增行设置多个变量。
-
候选组:即分配给一个或多个角色,跟上面一条一样也是变量,值分别为角色的id,不过他可以增行设置多个变量。
特别注意:当第一个输入框,即“分配”框中填写了变量时,下面的两个就不起作用,因为已经指定了具体的某个人,若希望分配给不同的人,或不同的角色,则第一个输入框应空着。
#2.5.人员分配好后,流程就画好啦,点击如下图的对勾,校验下有没有问题。
出现如下图所示的图片,就表示流程图绘制正确
而如果出现如下图所示,则表示流程图绘制有问题,点击红色方块,会提示哪里绘制不正确,一般为连接线没有连上,将其连好即可。
注意:本流程功能已符合中国式工作流,无需画退回按钮。
#3. 设计两个请假表单
进入菜单:业务流程-> 表单管理,点击新增表单,数据如下:
注意:名称和编码均不能重复
表单创建完毕,进入到列表页面,点击刚才创建的【设计】按钮,进入到如下表单设计器页面。
给每个表单组件填写数据字段,表单设计完成,点击保存。
点击刚才我们创建的“请假只读单”的“复制”按钮,创建一个“请假只读单”,将表单输入框都设为禁用,该表单用于审批时各节点查看。
注意:“填写单”和“只读单”为本案例需要,仅供参考,具体业务时可根据需要创建,比如:各节点均能修改表单数据时,可只创建一个填写单即可
#4. 编写一个groovy脚本
进入菜单:业务流程-> 脚本管理,点击新增脚本(脚本语法为groovy,学习地址:https://www.w3cschool.cn/groovy),数据如下:
注意:此处仅为测试打印一句话,具体业务时,可自行编写脚本内容
#5. 把模型部署好
进入菜单:业务流程-> 模型管理,点击我们刚刚创建的“请假流程”的那条数据的“部署”按钮,选择分类:
点击“确定”流程部署完成。
#6. 对部署的定义进行相关配置
进入菜单:业务流程-> 定义管理,点击我们刚刚部署好的“请假流程”的“配置”按钮,对流程定义进行配置。
#6.1.进入“选项”tab栏,对该流程定义的选项进行配置。
流程标题:可用内置变量为user:发起人姓名,time:发起时间,title: 流程名称,可自由组合为自己需要的格式,如:user发起了title[time], 则最终效果为:张三发起了请假流程[2020-09-07 12:00:00],如不填写,则默认格式为“user在time发起了title”。
自动完成第一个任务:即流程启动时,自动完成第一个任务,本流程第一个节点为填写申请单,在起草申请时,已将表单填写完成并启动流程,因此可配置为自动完成第一个任务。
跳过相同处理人:即在流程启动,或任务办理后,若下一节点的办理人跟上一节点的办理人相同,则自动跳过,例如:某流程第一个节点为填写申请单, 第二个节点为“部门经理审批”,张三为部门经理,则自己提交申请后,自动跳过“部门经理审批”节点,避免自己审批自己。
#6.2.进入“按钮”tab栏,对该流程定义的按钮进行配置。
点击“新增按钮”,通过选择活动节点,和勾选按钮的方式对该节点进行配置。
注意:配置了按钮的节点,在审批时拥有这些按钮的权限;“加签”和“减签”按钮仅适用于会签任务,若该任务节点不是会签任务却配置了这两个按钮,在审批时点击按钮会提示“该任务非会签任务”。 关于各个按钮的说明,请见后面第9节:办理一个任务。
若某节点未配置任何按钮,则默认拥有“提交”、“保存”、“退回”、“追踪”四个按钮的权限。
#6.3.进入“事件”tab栏,对该流程定义的事件进行配置。
点击“新增事件”按钮,通过选择“节点”或“全局”的方式,对某一节点,或整个流程的全局进行事件控制。
点击“事件类型”下拉框,选择事件的类型
在“脚本”框,可输入脚本代码,也可下拉选择已有的脚本。流程运行触发该事件时,将会执行脚本中的内容,脚本内置变量为execution(DelegateExecution),即当前流程执行器实例, 可以通过获取DelegateExecution,对当前流程执行情况进行处理,比如:流程启动时动态设置后续节点办理人,流程结束时给发起人发送消息等,均可以通过编写脚本的方式实现。
关于DelegateExecution中的方法与使用,请见org.flowable.engine.delegate.DelegateExecution类。
执行顺序:数字越小越先执行(相同的执行顺序,按创建时间正序执行,即最早创建的最先执行)
此处为方便演示,仅打印一句话,脚本输入:
System.out.println("这是打印的内容");
#6.4.进入“表单”tab栏,对该流程定义的表单进行配置。
点击“新增表单”按钮,通过选择表单与选择节点类型的方式给流程定义绑定表单。
节点类型:
启动 :顾名思义,即启动时候的表单,在起草申请时会获取该流程定义的启动节点表单,用于填写发起申请,因此此处配置为“请假填写单”。
全局:即流程的全局表单,在某节点没有配置单独的表单时,就会使用全局表单,一般全局表单用于审批时查看,因此此处配置为“请假只读单”。
节点:即专门给某节点配置表单,在此案例中,第一个节点是填写申请单,后续的节点退回时一般退回到此节点,由发起人修改表单内容后再提交,因此此处配置为“请假填写单”。 而我们在流程定义中配置了“自动完成第一个任务”,因此不会出现用户提交申请后又流转到“填写申请单”这个节点,会自动跳过,避免填写两次。
点击保存,至此,流程定义配置完毕。
#7. 把配置好的定义应用到入口
进入菜单:业务流程-> 定义管理,找到我们刚才配置好的“请假流程”的定义,点击“应用”按钮:
填写好入口名称,图标,排序等,点击保存,即将该流程应用到申请入口了,可以在菜单:业务流程-> 入口管理,看到我们刚才应用好的入口。
接下来,我们就要开始发起申请了。
#8. 在入口起草一个申请
进入菜单:在线办公-> 我的申请 -> 起草申请
点击“请假申请”,进入填写表单。
将表单填写完成,点击“发布”即启动流程。
#9. 办理一个任务
待办人登录系统,进入菜单:在线办公-> 我的任务 -> 待办任务,可看到收到一条待办任务。
点击“追踪”按钮,可看到该流程的图形化信息和审批记录。
点击“办理”按钮,进入到任务办理界面,可看到填写的申请单信息。
关于各按钮的说明
任务办理页面的按钮展示与否取决于【流程定义】菜单的【按钮配置】功能,见6.2节说明。
提交:
提交即将任务完成并流转至下一节点,点击“提交”按钮,弹出审批意见框
点击确定,即完成任务,并将任务流转至下一节点。
注意:在流程定义的按钮配置时,如果配置了“指定”这个按钮,则在点击提交时,会有指定下一节点办理人的选项,即,“指定”这个按钮并非真正的 按钮,它是与“提交”按钮组合形成的效果。如下图所示:
提交并指定下一步办理人信息后,任务将流转至下一节点,并设置好任务办理人、办理期限等。
保存:
保存即在用户审批任务时,若修改了填写的表单信息,但不想马上提交任务,则可以临时保存,填写的数据也会保存。
退回:
退回,顾名思义即将任务退回,本流程支持将任务退回到任一历史节点,并兼容并行网关,子流程等。
任务退回后,相应的审批人会收到该待办任务。
转办:
转办,即将本该属于自己办理的任务,因为一些特殊情况,转办给其他人,或其他角色。
点击转办后,要转办的人或角色都会收到一条待办任务,其中一人完成后,任务消失,并流转至下一节点。
委托:
委托,即阅示的意思。用户审批某任务时,不知道该不该给通过,或者拒绝,可邀请其他人来阅示,并给出意见,被邀请的人完成(解决)该任务并给出 意见后,任务会回到原办理人手里,原办理人提交任务,流转至下一节点。
终止:
终止,即直接终止该流程实例,终止后该流程实例直接结束。
追踪:
追踪,即追踪该流程的流转信息,这个在流程定义、起草申请、实例管理等处均可看到。 追踪包含可视化图形(鼠标放到节点上会变色,非静态图片)和每个节点的审批意见,如图所示:
挂起:
挂起,即将该流程实例挂起,跟【实例管理】里面的挂起功能一致,任务(实例)挂起后,待办人看不到该条待办任务。
跳转:
跳转这个功能就比较牛皮了,一般给领导审批的节点配置。点击“跳转”按钮,可将流程跳转到任意节点,注意是任意节点,哪怕是审批过的,它跟退回 的区别就是:退回只能退回到审批过的节点,跳转可以跳到任意节点。此功能能够满足特事特办的需求。
加签:
加签,即给会签(或签)任务动态增加办理人,增加的办理人会收到待办任务。
此功能仅针对会签(或签)任务,如果不是会签(或签)任务,即便 有此按钮,点击加签也会提示“该任务不是会签(或签)任务或节点配置错误”。
减签:
加签,即给会签(或签)任务动态减少办理人,减去的办理人不会收到待办任务。 点击“减签”按钮,会弹出减签对话框,并列出本节点原本该审批的人是哪些,可以减少一个或多个人。
此功能仅针对会签(或签)任务,如果不是会签(或签)任务,即便 有此按钮,点击加签也会提示“该任务不是会签(或签)任务或节点配置错误”。
打印:
打印就是打印当前申请单,可用作存档等。
#已办任务
进入菜单:在线办公-> 我的任务 -> 已办任务,可看到我们刚刚办理的任务。
在已办任务的“追踪”功能可以看到我们刚刚的审批信息。
#10. 看看流程的运行情况
进入菜单:业务流程->实例管理,可以对所有的流程实例进行管理与监控
可以对未结束的流程进行挂起、结束(终止)等操作。逻辑如下:
未结束的流程:
- 未挂起的流程:可以挂起,可以结束
- 已挂起的流程:可以激活,不可结束,激活后才能结束
已结束的流程:
不能操作
点击流程标题的链接,会进入到该实例的任务办理情况。
#11.常见问题汇总(不断更新)
#11.1 代码树
工作流代码树
工作流代码树
│
├─button ->流程按钮
│
├─category ->流程分类
│
├─definition ->流程定义
│
├─draft ->流程草稿
│
├─event ->流程事件
│
├─form ->流程表单
│
├─instance ->流程实例
│
├─model ->流程模型
│
├─option ->流程选项
│
├─script ->流程脚本
│
├─shortcut ->申请入口
│
├─task ->任务相关
│ │
│ ├─donetask ->已办任务
│ │
│ ├─handletask ->任务办理
│ │
│ ├─instancetask ->实例任务
│ │
│ └─todotask ->待办任务
│
└─user ->流程用户
#11.2 怎么用工作流
将designer.sql、guns-separation.sql导入到您的数据库,然后在FlowableConfig.java中找到如下代码:
@Bean
public FlowableProperties flowableProperties() {
FlowableProperties flowableProperties = new FlowableProperties();
//关闭自动任务
flowableProperties.setAsyncExecutorActivate(false);
//关闭自动创建表,第一次创建完表之后可以关闭
flowableProperties.setDatabaseSchemaUpdate(Convert.toStr(false));
//关闭自动部署resource/processes中的流程文件
flowableProperties.setCheckProcessDefinitions(false);
return flowableProperties;
}
第一次使用,将setDatabaseSchemaUpdate改为true,启动项目,会自动创建工作流相关表,创建完毕,可将此处改为false,后续就不用再创建了。
#11.3 会签审批怎么配置
以上面的请假流程为例,我们看下会签审批如何配置:
-
1.双击某用户任务节点
-
2.多实例类型:Parallel(并行,并发执行,到此节点时同时生成多个任务);Sequential(串行,按顺序执行,生成一个任务,一人审批完成继续生成下一个任务)
-
3.多实例基数:定义多实例的基数,指定多实例会签人数,循环多少次后结束,一般设定会签人集合的大小,例如:${num} (可在流程启动时设定该变量,类型为 Integer)
-
4.多实例集合的变量名:即会签人id集合的变量名,如pers,可在流程启动时设置该变量,传入要会签的人的id的集合。
-
5.多实例元素变量名:即循环遍历时每个元素的变量名,如per,则需要在该节点的审批人中指定为${per}
-
6.多实例完成条件:定义多实例的完成条件,内置多实例变量包括:nrOfInstances(实例总数)、nrOfActiveInstances(当前还未完成的,对于顺序的多实例,此值总是1)、nrOfCompletedInstances(已完成的实例个数),例如:${nrOfCompletedInstances/nrOfInstances >= 0.8} (说明当有 80% 的任务完成时,会完成此多实例)。 如未配置,则所有人审批完成后,流程才流转至下一节点。
流程配置完成后,在流程启动事件添加脚本:启动时设置会签人员。
脚本内容如下:
import cn.hutool.core.collection.CollectionUtil;
import cn.stylefeng.guns.flowable.core.utils.BpmScriptUtil;
List<Long> userIdList = CollectionUtil.newArrayList();
//此处直接设置三个用户id,在实际业务中,您可以自己定义会签人员的获取方式,
//比如LoginContextHolder.me().getCurrentUserLeaders()
//获取当前用户的领导id集合,在getCurrentUserLeaders()中编写您获取当前用户领导id集合的逻辑即可
userIdList.add(1275735541155614721);
userIdList.add(1280700700074041345);
userIdList.add(1280709549107552257);
//调用脚本工具类,给执行实例设置会签人员
//execution(DelegateExecution)为内置变量,您可以通过execution来对流程执行实例进行各种操作
//关于DelegateExecution中的方法与使用,请见org.flowable.engine.delegate.DelegateExecution类。
BpmScriptUtil.setVariableForInstance(execution, "pers", userIdList);
//调用脚本工具类,给执行实例设置多实例基数为会签人员数量
BpmScriptUtil.setVariableForInstance(execution, "num", 3);
以上内容配置好后,启动流程,会执行此脚本,给该节点设置会签人员,流程运转到该节点时,该节点设置的会签人员每个人都会收到待办任务,进行会签审批。
#11.4 上线相关
由于flowable使用的数据库名为大写,在部署到linux时,请开启大小写忽略: 打开my.cnf或my.ini
lower_case_table_names = 1