首先idea安装actiBPM插件
打开file --> setting 面板
如果插件列表中没actiBPM,则进行 2 操作,进行浏览插件搜索 actiBPM,然后点击 “install” 按钮安装即可,然后重启idea
创建简单的流程图
在resource文件夹上右键,New–>BPMN File 新建文件,弹出窗口,然后输入文件
绘制完成后,改后缀名为xml, 然后将其导出为png
参考地址:https://blog.csdn.net/fy_java1995/article/details/99691583
使用java程序生成activiti数据库表
首先引入jar
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
<scope>runtime</scope>
</dependency>
<!-- 工作流插件 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>7.1.0.M6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.activiti/activiti-spring -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>7.1.0.M6</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-layout</artifactId>
<version>7.1.0.M6</version>
<!--<scope>test</scope>-->
</dependency>
配置文件,配置数据库,这里使用的是mysql8
activiti.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="com.mysql.cj.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="123456"></property>
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
生成工作流表
两种方式
@Test
public void test1() {
//1.创建ProcessEngineConfiguration对象
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//2.创建ProcessEngine对象
ProcessEngine processEngine = configuration.buildProcessEngine();
System.out.println(processEngine);
}
@Test
public void test2() {
//使用下面这种方式生成表的条件
//1.activiti配置文件名称必须为activiti.cfg.xml
//2.bean的id必须为"processEngineConfiguration"
ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(defaultProcessEngine);
}
使用activiti的步骤是(前提是流程图表已建立)
- 画工作流程图(此步可动态)
- 部署工作流程图
- 开启流程
- 查询任务
- 处理任务
部署流程对象
//1.创建ProcessEngineer对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.部署对象
Deployment deploy = repositoryService.createDeployment()
//添加bpmn资源
.addClasspathResource("mytest.bpmn")
//添加图片文件资源
.addClasspathResource("mytest.png")
.name("新的请假申请流程")
.deploy();
//4.输出部署的一些信息
System.out.println(deploy.getId());
System.out.println(deploy.getName());
注意我的流程图文件就在resources文件夹下,如果不是的话,要加上文件夹,如bpm/mytest.bpmn
开启一个流程
/**
* 背后影响的表:
* act_hi_actinst: 已完成的活动信息
* act_hi_identitylink: 参与者信息
* act_hi_procinst: 流程实例
* act_hi_taskinst: 任务实例
* act_ru_execution: 执行表
* act_ru_identitylink: 参与者信息
* act_ru_task: 任务
*/
RuntimeService runtimeService = processEngine.getRuntimeService();
runtimeService.startProcessInstanceByKey("holiday");
查询任务
根据接收人查询当前任务,可获取节点id以便处理时使用
//根据接收人查询当前任务
TaskService taskService = processEngine.getTaskService();
//根据assignee(节点接受人)查询任务
String assignee = "张三";//
List<Task> tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
//首次运行的时候这个没有输出,因为第一次运行的时候扫描act_ru_task的表里面是空的,但第一次运行完成之后里面会添加一条记录,之后每次运行里面都会添加一条记录
for (Task task : tasks) {
System.out.println("taskId=" +"流程任务节点信息ID:"+ task.getId() +
",taskName:" +"流程任务节点名称ID:" +task.getName() +
",assignee:" + "流程任务节点接受人:"+task.getAssignee() +
",createTime:" +"流程任务节点创建时间:"+ task.getCreateTime());
}
执行任务
任务完成审批流程
TaskService taskService = processEngine.getTaskService();
//taskId 就是查询任务中的 ID
String taskId = "27502";
//完成请假申请任务
taskService.complete(taskId);
其他
查询流程定义明细
RepositoryService repositoryService = processEngine.getRepositoryService();
//创建查询对象
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
//添加查询条件
query.processDefinitionKey("holiday");//通过key获取
// .processDefinitionName("My process")//通过name获取
// .orderByProcessDefinitionId()//根据ID排序
//执行查询获取流程定义明细
List<ProcessDefinition> pds = query.list();
for (ProcessDefinition pd : pds) {
System.out.println("ID:"+pd.getId()+",NAME:"+pd.getName()+",KEY:"+pd.getKey()+",VERSION:"+pd.getVersion()+",RESOURCE_NAME:"+pd.getResourceName()+",DGRM_RESOURCE_NAME:"+pd.getDiagramResourceName());
}
可获取到该流程的各个发布信息,版本号
ID:holiday:1:4,NAME:null,KEY:holiday,VERSION:1,RESOURCE_NAME:mytest.bpmn,DGRM_RESOURCE_NAME:mytest.png
ID:holiday:2:2504,NAME:null,KEY:holiday,VERSION:2,RESOURCE_NAME:mytest.bpmn,DGRM_RESOURCE_NAME:mytest.png
ID:holiday:3:5004,NAME:null,KEY:holiday,VERSION:3,RESOURCE_NAME:mytest.bpmn,DGRM_RESOURCE_NAME:mytest.png
ID:holiday:4:7504,NAME:null,KEY:holiday,VERSION:4,RESOURCE_NAME:mytest.bpmn,DGRM_RESOURCE_NAME:mytest.png
流程定义删除
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.创建RepositoryService对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.执行删除流程定义 参数代表流程部署的id
repositoryService.deleteDeployment("1");
流程历史信息的查看
//1.得到ProcessEngine对象
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2.得到HistoryService
HistoryService historyService = processEngine.getHistoryService();
//3.得到HistoricActivitiInstanceQuery对象
HistoricActivityInstanceQuery historicActivityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
historicActivityInstanceQuery.processInstanceId("2501");//设置流程实例的id
//4.执行查询
List<HistoricActivityInstance> list = historicActivityInstanceQuery
.orderByHistoricActivityInstanceStartTime().asc().list();//排序StartTime
//5.遍历查询结果
System.out.println("=============================");
for (HistoricActivityInstance instance : list) {
System.out.println(instance.getActivityId());
System.out.println(instance.getActivityName());
System.out.println(instance.getProcessDefinitionId());
System.out.println(instance.getProcessInstanceId());
System.out.println("=============================");
}
流程实例参考地址:https://blog.csdn.net/fy_java1995/article/details/99691583
数据库表说明
数据库表的命名规则:
Activiti 的表都以 ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的 API 对应。
ACT_RE_*: 'RE’表示 repository。 这个前缀的表包含了流程定义和流程静态资源 (图片, 规则,等等)。
ACT_RU_*: 'RU’表示 runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务, 等运行中的数据。 Activiti 只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_HI_*: 'HI’表示 history。 这些表包含历史数据,比如历史流程实例, 变量,任务等。
ACT_GE_*: GE 表示 general。通用数据, 用于不同场景下。
主要使用以下表:
流程部署表
SELECT * FROM act_re_deployment
流程定义表
SELECT * FROM act_re_procdef
资源文件表
SELECT * FROM act_ge_bytearray
系统配置表
SELECT * FROM act_ge_property
启动流程实例涉及到的表
流程实例运行时 执行对象表
SELECT * FROM act_ru_execution
流程实例运行时 身份联系表
SELECT * FROM act_ru_identitylink
流程实例运行时 用户任务表
SELECT * FROM act_ru_task
活动节点历史表
SELECT * FROM act_hi_actinst
身份联系表 历史
SELECT * FROM act_hi_identitylink
流程实例表 历史
SELECT * FROM act_hi_procinst
历史任务表
SELECT * FROM act_hi_taskinst