一、 安裝Activiti插件
1. 首先打開FIle的setting功能,搜索Plugins:

2. 輸入actiBPM,然后點擊搜索:

3. 點擊安裝、應用:

安裝好之后點擊apply(應用),之后重啟idea
二、 創建Activiti工作流並導出流程圖圖片
1. 重啟IDEA之后,點擊File文件中的New下的BpmnFile:

2. 給這個文件起好名字后拖動右邊的圖標到左邊:

3. 把鼠標放到節點中心,中心會變成黑白扇形:

4. 拖拽連線到另一個圖標進行畫圖:

5. 左鍵單擊節點就會出現左邊的修改按鈕:

Id命名規范: 要以字母或下划線 () 字符開頭,后接 XML 規范中允許的任意字母、數字、重音字符、變音符號、句點 (.)、連字符 (-) 和下划線 () 的組合。
否則》》》(報org.activiti.bpmn.exceptions.XMLException: cvc-datatype-valid.1.2.1: '' 不是 'NCName' 異常)
6. 接着修改文件的后綴名為.xml:

打開該文件可以看到,流程圖以xml代碼格式呈現(當然也可以在重命名改回去)
7. 接着右鍵該文件:

如果沒有出現圖中的按鈕,可以按快捷鍵Ctrl+alt+Shift+U,按了以后,以后這個圖標就會出現了

8. 導出圖片

可以點擊該按鈕保存這圖片,后綴名自己設置下.png
三、 解決圖片亂碼bug
如果圖片中有中文會出現亂碼,需要在這兩個文件下的后面都加上
-Dfile.encoding=UTF-8


然后重啟IDEA,把原來的PNG圖片刪掉,再生成一次就不會出現亂碼了
四、 測試(test)工作流開發
1. 引入pom.xml依賴
<!--JUnit測試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--- Activiti依賴導入 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>5.18.0</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.18.0</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>spring-eans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>jackson-core-asl</artifactId>
<groupId>org.codehaus.jackson</groupId>
</exclusion>
<exclusion>
<artifactId>commons-lang3</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
<exclusion>
<artifactId>commons-lang3</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
</exclusions>
</dependency>
2. 在src/main/resources下面新建一個BPMN文件
(同上文操作的創建工作流)
3. 畫完流程圖之后要更改對應元素的name和assignee,Id

然后點擊空白地方,把流程ID和名稱改掉,如下圖:

4. 之后把數據庫建好,建一個activiti.cfg.xml在resource下面
<?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>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="root"></property>
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
5. 新建一個java類,用來生成表

@Test
public void crateTable(){
ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();
}
運行這個類之后數據庫里面會生成24張表, 23-25張表都是有可能的,我這里是生成了24張表,多了一張act_evt_log,事件處理日志表。最主要的還是那23張表

6. 之后就可以開始部署流程

代碼:
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
//部署流程
@Test
public void deployProcess(){
RepositoryService repositoryService=processEngine.getRepositoryService();
DeploymentBuilder builder=repositoryService.createDeployment();
builder.addClasspathResource("myWork.bpmn");
builder.deploy();
}
部署之后就可以在act_re_procdef表中看到對相應的流程信息
7. 啟動流程

代碼:
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
@Test
public void startProcess(){
RuntimeService runtimeService=processEngine.getRuntimeService();
runtimeService.startProcessInstanceByKey("myProcess_1");
}
啟動流程之后就會有相應的任務產生,存在act_ru_task表中,可以查看任務節點

代碼:
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
@Test
public void queryProcess(){
TaskService taskService=processEngine.getTaskService();
String assigne="student";
List<Task> tasks=taskService.createTaskQuery().taskAssignee(assigne).list();
int size=tasks.size();
for(int i=0;i<size;i++){
Task task=tasks.get(i);
}
for (Task task:tasks){
System.out.println("taskId=" +"流程任務節點信息ID:"+ task.getId() +
",taskName:" +"流程任務節點名稱ID:" +task.getName() +
",assignee:" + "流程任務節點接受人:"+task.getAssignee() +
",createTime:" +"流程任務節點創建時間:"+ task.getCreateTime());
}
}
首次運行的時候這個沒有輸出,因為第一次運行的時候掃描act_ru_task的表里面是空的,但第一次運行完成之后里面會添加一條記錄,之后每次運行里面都會添加一條記錄
8. 查詢流程明細定義明細

代碼:
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
@Test
public void queryProcdef(){
RepositoryService repositoryService=processEngine.getRepositoryService();
ProcessDefinitionQuery query=repositoryService.createProcessDefinitionQuery();
query.processDefinitionKey("myProcess_1");
List<ProcessDefinition> pds=query.list();
System.out.println(">>>>>>>>>>>>>>>>>>>>>");
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());
}
}
9. 審核過程完成任務節點審批

代碼:
ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();
@Test
public void startProcessApproval(){
TaskService taskService=processEngine.getTaskService();
//taskId 就是查詢任務中的 ID
String taskId="2504";
//完成請假申請任務
taskService.complete(taskId);
}
10. 流程詳細步驟:
部署流程》》》》》》啟動流程》》》》》》查詢用戶id》》》》用戶完成任務》》》流程結束
五、 生成流程報表

流程部署表
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`