Flowable流程设计器有两种实现方式
- Eclipse Designer
- Flowable UI应用
1.Eclipse Designer
Flowable提供了名为Flowable Eclipse Designer的Eclipse插件,可以用于图形化地建模、测试与部署BPMN 2.0流程。
(1).下载安装Eclipse
去Eclipse官网下载即可:https://www.eclipse.org/downloads/packages/release 注意2020-09后的版本不再支持jdk8

解压缩就可以了,然后进入解压缩的目录

直接启动即可


(2).安装Flowable插件
安装Flowable的插件,选择Help → Install New Software。在下图面板中,点击Add按钮,并填写下列字段
- Name: Flowable BPMN 2.0 designer
- Location: http://www.flowable.org/designer/update/

这种在线更新的方式已经被官网移除了,操作不了

这时我们就只能通过离线安装的方式来实现了,下载对应的离线文件

安装步骤来操作
然后继续:选择Help → Install New Software




然后finish。弹出如下窗口

重启即可
(3).创建项目
然后我们就可以创建一个Flowable Project了

然后我们可以在src/mian/resources/ 的目录下创建对应的流程图了

看到如下的界面说明插件安装成功了

(4).创建流程图
使用滑板来绘制流程,通过从右侧把图标拖拽到左侧的面板,最终的效果

指定流程的主键

指定任务的负责人
在Properties视图中指定每个任务节点的负责人

创建请假单:zhangsan
审批请假单:lisi
当我们设置完成后保存文件,会同时生成png图片

注意:生成图片需要如下配置

(5).部署流程
首先在Eclipse中生成bar文件,选中项目然后鼠标右击

然后会发现在项目的根目录下多了一个deployment文件夹,里面多了一个MyProcess.bar文件

然后我们就可以把这个bar文件拷贝到IDEA中,继续部署的流程

而部署的代码和前面没啥区别
@Test
public void testDeploy(){
// 1.获取 ProcessEngine 对象
ProcessEngine processEngine = configuration.buildProcessEngine();
// 2.获取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
InputStream in = this.getClass().getClassLoader().getResourceAsStream("MyHoliday.bar");
ZipInputStream zipInputStream = new ZipInputStream(in);
// 3.完成流程的部署操作 ZIP 或者 Bar文件
Deployment deploy = repositoryService.createDeployment()
// .addClasspathResource("MyHoliday.bar")// 关联要部署的流程文件
.addZipInputStream(zipInputStream)
.name("XXX公司请求流程")
.deploy() ;// 部署流程
System.out.println("deploy.getId() = " + deploy.getId());
System.out.println("deploy.getName() = " + deploy.getName());
}
执行后查看表结构,相关的信息就进去了

完整的案例代码:
package com.bobo.flowable.test;
import org.flowable.engine.*;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.Task;
import org.junit.Before;
import org.junit.Test;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;
public class Test02 {
ProcessEngineConfiguration configuration = null;
@Before
public void before(){
// 获取 ProcessEngineConfiguration 对象
configuration = new StandaloneProcessEngineConfiguration();
// 配置 相关的数据库的连接信息
configuration.setJdbcDriver("com.mysql.cj.jdbc.Driver");
configuration.setJdbcUsername("root");
configuration.setJdbcPassword("123456");
configuration.setJdbcUrl("jdbc:mysql://localhost:3306/flowable-learn?serverTimezone=UTC&nullCatalogMeansCurrent=true");
// 如果数据库中的表结构不存在就新建
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
}
/**
* 部署流程
*
*/
@Test
public void testDeploy(){
// 1.获取 ProcessEngine 对象
ProcessEngine processEngine = configuration.buildProcessEngine();
// 2.获取RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
InputStream in = this.getClass().getClassLoader().getResourceAsStream("MyHoliday.bar");
ZipInputStream zipInputStream = new ZipInputStream(in);
// 3.完成流程的部署操作 ZIP 或者 Bar文件
Deployment deploy = repositoryService.createDeployment()
// .addClasspathResource("MyHoliday.bar")// 关联要部署的流程文件
.addZipInputStream(zipInputStream)
.name("XXX公司请求流程")
.deploy() ;// 部署流程
System.out.println("deploy.getId() = " + deploy.getId());
System.out.println("deploy.getName() = " + deploy.getName());
}
/**
* 启动流程实例
*/
@Test
public void testRunProcess(){
ProcessEngine processEngine = configuration.buildProcessEngine();
// 我们需要通过RuntimeService来启动流程实例
RuntimeService runtimeService = processEngine.getRuntimeService();
// 启动流程实例
ProcessInstance holidayRequest = runtimeService.startProcessInstanceById("myProcess:1:25004");
System.out.println("holidayRequest.getProcessDefinitionId() = " + holidayRequest.getProcessDefinitionId());
System.out.println("holidayRequest.getActivityId() = " + holidayRequest.getActivityId());
System.out.println("holidayRequest.getId() = " + holidayRequest.getId());
}
/**
* 测试任务查询
*/
@Test
public void testQueryTask(){
ProcessEngine processEngine = configuration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey("myProcess") // 指定查询的流程编程
.taskAssignee("zhangsan") // 查询这个任务的处理人
.list();
for (Task task : list) {
System.out.println("task.getProcessDefinitionId() = " + task.getProcessDefinitionId());
System.out.println("task.getName() = " + task.getName());
System.out.println("task.getAssignee() = " + task.getAssignee());
System.out.println("task.getDescription() = " + task.getDescription());
System.out.println("task.getId() = " + task.getId());
}
}
/**
* 完成当前任务
*/
@Test
public void testCompleteTask(){
ProcessEngine processEngine = configuration.buildProcessEngine();
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.processDefinitionKey("myProcess")
.taskAssignee("lisi")
.singleResult();
// 创建流程变量
if(task != null){
// 完成任务
taskService.complete(task.getId());
}
}
/**
* 获取流程任务的历史数据
*/
@Test
public void testHistory(){
ProcessEngine processEngine = configuration.buildProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
.processDefinitionId("myProcess:1:25004")
.finished() // 查询的历史记录的状态是已经完成
.orderByHistoricActivityInstanceEndTime().asc() // 指定排序的字段和顺序
.list();
for (HistoricActivityInstance history : list) {
System.out.println(history.getActivityName()+":"+history.getAssignee()+"--"
+history.getActivityId()+":" + history.getDurationInMillis()+"毫秒");
}
}
}
2.Flowable UI应用
Flowable提供了几个web应用,用于演示及介绍Flowable项目提供的功能:
- Flowable IDM: 身份管理应用。为所有Flowable UI应用提供单点登录认证功能,并且为拥有IDM管理员权限的用户提供了管理用户、组与权限的功能。
- Flowable Modeler: 让具有建模权限的用户可以创建流程模型、表单、选择表与应用定义。
- Flowable Task: 运行时任务应用。提供了启动流程实例、编辑任务表单、完成任务,以及查询流程实例与任务的功能。
- Flowable Admin: 管理应用。让具有管理员权限的用户可以查询BPMN、DMN、Form及Content引擎,并提供了许多选项用于修改流程实例、任务、作业等。管理应用通过REST API连接至引擎,并与Flowable Task应用及Flowable REST应用一同部署。
所有其他的应用都需要Flowable IDM提供认证。每个应用的WAR文件可以部署在相同的servlet容器(如Apache Tomcat)中,也可以部署在不同的容器中。由于每个应用使用相同的cookie进行认证,因此应用需要运行在相同的域名下。
(1).安装部署
下载Tomcat:https://tomcat.apache.org/download-80.cgi 官网下载后解压缩到非中文目录即可,然后是下载FlowableUI的文件,在Flowable6.6之后把FlowableUI中提供的四个功能合并到了一起。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W4R6dfaR-1681261047591)(img\image-20220318102128672.png)]](https://img-blog.csdnimg.cn/b8732e1fccc3464cb6154f73be54bfe9.png)
然后把解压缩后的两个war包拷贝到Tomcat的解压缩的webapps目录下

Tomcat目录:

(2).启动服务
启动Tomcat服务,执行startup.bat文件

如果启动中出现乱码修改Tomcat的conf目录下的 logging.properties 文件中的编码

如果一闪而过则检查jdk的环境变量配置。
启动成功后,在浏览器中访问 http://localhost:8080/flowable-ui, 默认的账号密码是 admin/test

(3).用户管理
我们先在 身份管理应用程序 中创建用户并授权

创建用户

填写详细信息

授权管理

(4).绘制流程
创建新的流程

流程图界面

创建流程,分配处理人


继续完成流程图的创建

(5).部署流程
绘制好的流程图,我们只需要一键导出即可

下载下来后拷贝到项目的resource目录下即可

然后就是正常的操作流程了
(6).FlowableUI 演示
1).部署流程
在FlowableUI中提供了演示程序

创建一个新的应用程序,并指定相关的信息

创建应用后需要指定对应的流程图



发布应用程序

2). 启动流程
发布了应用程序后我们就可以来启动流程了




点击显示图:

也就是可以看到当前是user1来处理,user1登录后可以看到要处理的流程,user2登录是看不到的。

点击完成后流程就向下一步流转了

这时再通过user2登录,就可以看到对应的代办的信息


然后点击完成,那么整个流程就结束了


















