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中提供的四个功能合并到了一起。
然后把解压缩后的两个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登录,就可以看到对应的代办的信息
然后点击完成,那么整个流程就结束了