# activiti
**Repository Path**: nikolz/activiti
## Basic Information
- **Project Name**: activiti
- **Description**: activiti
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 2
- **Forks**: 0
- **Created**: 2018-06-08
- **Last Updated**: 2022-06-01
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# activiti学习
#### 项目介绍
activiti 工作流学习 (当前版本6.0)
#### 软件架构
springboot + mybatis + mysql + redis + thymeleaf + spring-security + activiti
#### 源码下载
git clone https://gitee.com/nikolz/activiti.git
#### 学习资料
1. 官方网站 https://www.activiti.org/
2. 快速开始 https://www.activiti.org/quick-start
3. 用户指南 https://www.activiti.org/userguide/
4. 疯狂工作流讲义系列 https://my.oschina.net/JavaLaw?tab=popular
#### 开发指南
> 本文描述springboot + activiti6整合方案,其他部分请查阅相关文档。
**前言概要**
* **7** 大接口
- RepositoryService:提供一系列管理流程部署和流程定义的API。
- RuntimeService:在流程运行时对流程实例进行管理与控制。
- TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等。
- IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
- ManagementService:提供对流程引擎进行管理和维护的服务。
- HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
- FormService:表单服务。
* **28** 张表
- act_ge_ 通用数据表,ge是general的缩写
- act_hi_ 历史数据表,hi是history的缩写,对应HistoryService接口
- act_id_ 身份数据表,id是identity的缩写,对应IdentityService接口
- act_re_ 流程存储表,re是repository的缩写,对应RepositoryService接口,存储流程部署和流程定义等静态数据
- act_ru_ 运行时数据表,ru是runtime的缩写,对应RuntimeService接口和TaskService接口,存储流程实例和用户任务等动态数据
参考文档:[Activiti工作流引擎主要表结构详解](https://my.oschina.net/fuyung/blog/472842)
1. pom.xml文件中添加依赖
```java
org.activiti
activiti-spring-boot-starter-basic
6.0.0
```
2. 数据源和activiti配置(application.yml)
```java
# activiti default configuration
spring:
activiti:
#自动部署验证设置:true-开启(默认)、false-关闭
check-process-definitions: false
database-schema-update: true
#默认值
# process-definition-location-prefix: classpath:/processes/
# process-definition-location-suffixes:
# - **.bpmn
# - **.bpmn20.xml
history-level: full
```
3. 绘制流程图
1). Eclipse插件
> 安装 **Activiti-Designer** 插件 ,安装方法请自行查阅
2). idea插件
> 安装 **actiBPM** 插件 ,安装方法请自行查阅
3). activiti-app
> 浏览器访问http://localhost:8080/activiti-app 登录账户:admin : test
>
> 参考文档:[下载和运行Activiti](https://my.oschina.net/JavaLaw/blog/1542771)
4. 部署流程
两种方式部署
1). springboot自动部署
> 配置 spring.activiti.check-process-definitions: true
2). 手动部署
```java
//根据bpmn文件部署流程
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("processes/" + bpmn).deploy();
```
5. 执行任务
```java
//设置执行人
identityService.setAuthenticatedUserId(userName);
//开始流程
ProcessInstance vacationInstance = runtimeService.startProcessInstanceByKey(Constant.PROCESS_DEFINE_KEY);//流程名称 eg: testProcess
// 查询当前任务
Task currentTask = taskService.createTaskQuery().processInstanceId(vacationInstance.getId()).singleResult();
// 申明任务
taskService.claim(currentTask.getId(), userName);
//任务参数
Map vars = new HashMap<>(4);
vars.put("applyUser", userName);
vars.put("days", vac.getDays());
vars.put("reason", vac.getReason());
//执行任务
taskService.complete(currentTask.getId(), vars);
```
6. 查询任务
> 查询可参考文档:
>
> [Activiti数据查询(一)](https://my.oschina.net/JavaLaw/blog/1548089)
>
> [Activiti数据查询(二)](https://my.oschina.net/JavaLaw/blog/1549900)
1). 查询当前任务
```java
List instanceList = runtimeService.createProcessInstanceQuery().startedBy(userName).list();
```
2). 查询历史任务
7. ```java
List hisProInstance = historyService.createHistoricProcessInstanceQuery()
.processDefinitionKey(Constant.PROCESS_DEFINE_KEY).startedBy(userName).finished()
.orderByProcessInstanceEndTime().desc().list();
```
#### 遇到的的问题
1. 如果项目里引入了mapper,则需要再mapper依赖中排除persistence-api,否则会以下的错误:
`Consider defining a bean of type 'javax.persistence.EntityManagerFactory' in your configuration.`
2. 在配置文件中,设置:
> spring.activiti.check-process-definitions: false
如果不设置,则会报错:
`java.io.FileNotFoundException: class path resource [processes/] cannot be resolved to URL because it does not exist`
如果设置为true,则需要在resources目录下添加processes文件夹
3. 在启动类上排除SecurityAutoConfiguration类
> @SpringBootApplication(exclude = SecurityAutoConfiguration.class)
如果不加,则报错:
`java.lang.ArrayStoreException: sun.reflect.annotation.TypeNotPresentExceptionProxy`