IDEA建立Activiti工作流開發第一篇(Maven專案)
首先建立一個新的Maven專案,建立完成後我們要安裝Activiti的外掛,首先開啟FIle的setting功能,搜尋Plugins:
輸入actiBPM,然後點選搜尋:
如圖點選安裝,它就會下載安裝
安裝好後點擊應用:
然後重啟IDEA,點選File檔案中的New下的BpmnFile:
給這個檔案起好名字後拖動右邊的圖示到左邊:
把滑鼠放到節點中心,中心會變成黑白扇形:
拖拽連線到另一個圖示進行畫圖:
全部連線後:
左鍵單擊節點就會出現左邊的修改按鈕
接著改檔案的字尾名為.xml:
接著:
如果沒有出現圖中的按鈕,可以按快捷鍵Ctrl+alt+Shift+U,按了以後,以後這個圖示就會出現了
接著選擇我們放這個檔案的資料夾:
然後發現產生了圖片:
不過如果有中文會出現亂碼,需要在這兩個檔案下的後面都加上-Dfile.encoding=UTF-8
然後重啟IDEA,把原來的PNG圖片刪掉,再生成一次就不會出現亂碼了
參考至:https://blog.csdn.net/qq_41728540/article/details/79506463
還有修改接受人 和流程名稱:
第二步配置依賴,pom.xml檔案修改如下:
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.lvzh</groupId> <artifactId>WorkNewTest</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>WorkNewTest Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <!--<scope>test</scope>--> </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-beans</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> <!--MySQL 驅動包,如果是其他庫的話需要換驅動包--> <!--<dependency>--> <!--<groupId>mysql</groupId>--> <!--<artifactId>mysql-connector-java</artifactId>--> <!--<version>5.1.35</version>--> <!--</dependency>--> <!-- 新增oracle驅動依賴 --> <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version>11.2.0.1.0</version> </dependency> <!--<dependency>--> <!--<groupId>org.junit.jupiter</groupId>--> <!--<artifactId>junit-jupiter-api</artifactId>--> <!--<version>RELEASE</version>--> <!--</dependency>--> </dependencies> <build> <finalName>WorkNewTest</finalName> <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>3.0.0</version> </plugin> <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>3.0.2</version> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.20.1</version> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>3.2.0</version> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
接著發現不能新建類和包的問題,用如下解決:
然後發現就可以新建包和類:
新建一個生成流程報表的類MyWorkTable,程式碼如下:
package com.lzh;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.junit.Test;
public class MyWorkTable {
@Test
public void creatTable(){
ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();
}
}
在resource檔案下新建一個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>-->
<!--<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8"></property>-->
<!--<property name="jdbcUsername" value="username"></property>-->
<!--<property name="jdbcPassword" value="password"></property>-->
<!--<property name="databaseSchemaUpdate" value="true"></property>-->
<!--</bean>-->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="oracle.jdbc.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
<!--<property name="jdbcUrl" value="jdbc:oracle:thin:@(description=(address_list= (address=(host=localhost) (protocol=tcp)(port=1521))(address=(host=localhost)(protocol=tcp) (port=1521)) (load_balance=yes)(failover=yes))(connect_data=(service_name= orcl.genomics.cn)))"></property>-->
<property name="jdbcUsername" value="使用者名稱"></property>
<property name="jdbcPassword" value="密碼"></property>
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
記得resource檔案要改成這樣:
否則會檔案找不到的錯誤,再接著執行生成報表的類:
生成流程報表24張:
流程部署表
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`
參考來至:https://blog.csdn.net/artaganan8/article/details/77838019
接著部署流程,部署之後就可以在act_re_procdef 流程定義表 中看到對相應的流程資訊,首先先建一個部署類MyWorkDeploy:
package com.lzh;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.DeploymentBuilder;
import org.junit.Test;
public class MyWorkDeploy {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署流程
@Test
public void deployProcess(){
RepositoryService repositoryService = processEngine.getRepositoryService();
DeploymentBuilder builder = repositoryService.createDeployment();
builder.addClasspathResource("WorkTestNew.bpmn");//bpmn檔案的名稱
builder.deploy();
}
}
我們得把原來的WorkTestNew.xml重新改為WorkTestNew.Bpmn,接著我們新建一個啟動流程類MyWorkStart:
package com.lzh;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RuntimeService;
import org.junit.Test;
public class MyWorkStart {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//啟動流程
@Test
public void startProcess(){
RuntimeService runtimeService = processEngine.getRuntimeService();
runtimeService.startProcessInstanceByKey("myProcess_1");//流程的名稱,對應流程定義表的key欄位,也可以使用ByID來啟動流程
}
}
啟動流程之後就會有相應的任務產生,存在act_ru_task 執行時任務節點表 中,可以檢視任務節點,再接著我們新建一個查詢流程類MyWorkQuery:
package com.lzh;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.junit.Test;
import java.util.List;
public class MyWorkQuery {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//查詢流程
@Test
public void queryTask(){
TaskService taskService = processEngine.getTaskService();
//根據assignee(節點接受人)查詢任務
String assignee = "張三";//
List<Task> tasks = taskService.createTaskQuery().taskAssignee(assignee).list();
int size = tasks.size();
for (int i = 0; i < size; i++) {
Task task = tasks.get(i);
}
//首次執行的時候這個沒有輸出,因為第一次執行的時候掃描act_ru_task的表裡面是空的,但第一次執行完成之後裡面會新增一條記錄,之後每次執行裡面都會新增一條記錄
for (Task task : tasks) {
System.out.println("taskId=" +"流程任務節點資訊ID:"+ task.getId() +
",taskName:" +"流程任務節點名稱ID:" +task.getName() +
",assignee:" + "流程任務節點接受人:"+task.getAssignee() +
",createTime:" +"流程任務節點建立時間:"+ task.getCreateTime());
}
}
}
新建一個類MyWorkQueryProcess,用來查詢流程明細定義明細:
package com.lzh;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.junit.Test;
import java.util.List;
public class MyWorkQueryProcess {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//查詢流程定義明細
@Test
public void queryProcdef(){
RepositoryService repositoryService = processEngine.getRepositoryService();
//建立查詢物件
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
//新增查詢條件
query.processDefinitionKey("myProcess_1");//通過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());
}
}
}
新建一個稽核過程完成任務節點審批的類MyWorkProcessApproval:
package com.lzh;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.junit.Test;
//稽核過程
public class MyWorkProcessApproval {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
@Test
public void startProcessApproval(){
TaskService taskService = processEngine.getTaskService();
//taskId 就是查詢任務中的 ID
String taskId = "12502";
//完成請假申請任務
taskService.complete(taskId);
}
}
參考來至https://blog.csdn.net/c1225992531/article/details/81181017
https://blog.csdn.net/a67474506/article/details/38266129
執行部署流程MyWorkDeploy類的deployProcess方法後,我們可以看到act_re_procdef 流程定義表產生相應的流程資訊:
再接著我們啟動流程類MyWorkStart 的方法startProcess後 ,act_ru_task 執行時任務節點表 中,可以檢視任務節點:
到了第一個任務節點稽核,接下來由第一個任務節點的使用者審批完成節點任務,先查詢節點id,再啟動稽核流程方法,先是執行MyWorkQuery類的queryTask方法,再啟動MyWorkProcessApproval的startProcessApproval方法,然後你就會看到流程走到下一個節點,所以整個 流程的執行
部署流程》》》》》》啟動流程》》》》》》查詢使用者id》》》》使用者完成任務》》》流程結束