1.环境介绍:
数据库Mysql
jdk 1.8
spring boot 2.7.10
activiti 7.0.0.SR1
2.整体项目截图如下:
2.1 pom文件内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>gzls</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gzls</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.activiti.dependencies/activiti-dependencies -->
<dependency>
<groupId>org.activiti.dependencies</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.0.0.GA</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.0.0.SR1</version>
</dependency>
<!--<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
<scope>test</scope>
</dependency>
-->
<!--使用mysql数据库,导入mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.7.10</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies>
<repositories>
<repository>
<id>alfresco</id>
<name>Activiti Releases</name>
<url>https://artifacts.alfresco.com/nexus/content/repositories/activiti-releases/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.2 application配置文件内容
# 服务配置
server:
display-name: actdemo
port: 9095
# Spring相关配置
spring:
##数据库连接信息
datasource:
# 数据源配置
url: jdbc:mysql://127.0.0.1:3306/activititest?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: root #此处修改为自己的用户名
password: root #此处修改为自己的密码
driver-class-name: com.mysql.cj.jdbc.Driver
xa:
properties:
pinGlobalTxToPhysicalConnection: true
useServerPrepStmts: true
application:
# 注册应用名
name: actdemo
activiti:
# 自动建表
database-schema: ACTIVITI
database-schema-update: true
history-level: full
db-history-used: true
2.3 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.jdbc.Driver" />
<!-- 数据库地址-->
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/activititest" />
<!-- 数据库用户名-->
<property name="jdbcUsername" value="root" />
<!-- 数据库密码s-->
<property name="jdbcPassword" value="root" />
<property name="databaseSchemaUpdate" value="true" />
</bean>
</beans>
2.4 qingjia.bpmn20.xml内容
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
<process id="qingjia" name="qingjia" isExecutable="true">
<documentation>请假流程</documentation>
<startEvent id="startEvent1"></startEvent>
<userTask id="sid-9A40E883-3763-490D-AA8B-FCDC6E29D0BE" name="经理审批" activiti:assignee="zhangsan">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="sid-9A15DD7D-2CD6-4A46-A504-760717D40BFA" sourceRef="startEvent1" targetRef="sid-9A40E883-3763-490D-AA8B-FCDC6E29D0BE"></sequenceFlow>
<userTask id="sid-F28E89EE-79F8-4ADC-986E-D1376105E0E4" name="人事审批" activiti:assignee="lisi">
<extensionElements>
<modeler:initiator-can-complete xmlns:modeler="http://activiti.com/modeler"><![CDATA[false]]></modeler:initiator-can-complete>
</extensionElements>
</userTask>
<sequenceFlow id="sid-5A40B76D-FA2D-4B84-B5BF-9A1C49EDC5D2" sourceRef="sid-9A40E883-3763-490D-AA8B-FCDC6E29D0BE" targetRef="sid-F28E89EE-79F8-4ADC-986E-D1376105E0E4"></sequenceFlow>
<sequenceFlow id="sid-B962FA71-2E9B-4144-B055-40DB4EE4A106" sourceRef="sid-F28E89EE-79F8-4ADC-986E-D1376105E0E4" targetRef="sid-029AD32A-2618-4F64-A1CC-E80371F2B342"></sequenceFlow>
<endEvent id="sid-029AD32A-2618-4F64-A1CC-E80371F2B342"></endEvent>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_qingjia">
<bpmndi:BPMNPlane bpmnElement="qingjia" id="BPMNPlane_qingjia">
<bpmndi:BPMNShape bpmnElement="startEvent1" id="BPMNShape_startEvent1">
<omgdc:Bounds height="30.0" width="30.0" x="100.0" y="163.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-9A40E883-3763-490D-AA8B-FCDC6E29D0BE" id="BPMNShape_sid-9A40E883-3763-490D-AA8B-FCDC6E29D0BE">
<omgdc:Bounds height="80.0" width="100.0" x="175.0" y="138.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-F28E89EE-79F8-4ADC-986E-D1376105E0E4" id="BPMNShape_sid-F28E89EE-79F8-4ADC-986E-D1376105E0E4">
<omgdc:Bounds height="80.0" width="100.0" x="320.0" y="138.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="sid-029AD32A-2618-4F64-A1CC-E80371F2B342" id="BPMNShape_sid-029AD32A-2618-4F64-A1CC-E80371F2B342">
<omgdc:Bounds height="28.0" width="28.0" x="480.0" y="164.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sid-9A15DD7D-2CD6-4A46-A504-760717D40BFA" id="BPMNEdge_sid-9A15DD7D-2CD6-4A46-A504-760717D40BFA">
<omgdi:waypoint x="130.0" y="178.0"></omgdi:waypoint>
<omgdi:waypoint x="175.0" y="178.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-B962FA71-2E9B-4144-B055-40DB4EE4A106" id="BPMNEdge_sid-B962FA71-2E9B-4144-B055-40DB4EE4A106">
<omgdi:waypoint x="420.0" y="178.0"></omgdi:waypoint>
<omgdi:waypoint x="480.0" y="178.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="sid-5A40B76D-FA2D-4B84-B5BF-9A1C49EDC5D2" id="BPMNEdge_sid-5A40B76D-FA2D-4B84-B5BF-9A1C49EDC5D2">
<omgdi:waypoint x="275.0" y="178.0"></omgdi:waypoint>
<omgdi:waypoint x="320.0" y="178.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
2.5 GzlApplication.java 内容
package org.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GzlApplication {
public static void main(String[] args) {
SpringApplication.run(GzlApplication.class, args);
}
}
2.6 ActivitiTest.java 内容
package org.example;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.task.Task;
import org.junit.Test;
import java.util.List;
public class ActivitiTest {
/**
* 部署一个流程
*/
@Test
public void testDeployment(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService =processEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment()
// 定义流程资源名称
.name("出差申请流程")
// 加载待部署的资源,可以多次引用
.addClasspathResource("bpmn/qingjia.bpmn20.xml")
// 完成部署
.deploy();
}
/**
* 发起流程
*/
@Test
public void startTranslate(){
ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService =processEngine.getRuntimeService();
runtimeService.startProcessInstanceById("qingjia:1:3");
}
/**
* 查询需要XX审批的流程,并且审批通过
*
*/
@Test
public void getTaskTranslate(){
ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
TaskService taskService =processEngine.getTaskService();
//taskAssignee("lisi") 可以更改审批人
List<Task> tasks=taskService.createTaskQuery().taskAssignee("lisi").list();
for (Task t:tasks) {
//通过审批
taskService.complete("5002");
}
}
/**
* 获取历史审批记录
*/
@Test
public void getHistoricalApproval(){
ProcessEngine processEngine =ProcessEngines.getDefaultProcessEngine();
HistoryService historyService=processEngine.getHistoryService();
//获取历史流程实例
List<HistoricProcessInstance> hiqs = historyService.createHistoricProcessInstanceQuery().list();
for (HistoricProcessInstance d:hiqs) {
//根据查询的实例找到本次实例审批时间
List<HistoricTaskInstance> ds =historyService.createHistoricTaskInstanceQuery().processInstanceId(d.getId()).list();
for (HistoricTaskInstance s:ds) {
System.out.println("taskId:" + s.getId()+",");
System.out.println("name:" + s.getName()+",");
System.out.println("pdId:" + s.getProcessDefinitionId()+",");
System.out.println("assignee:" + s.getAssignee()+",");
}
}
}
}