1. 程式人生 > >IDEA建立Activiti工作流開發第一篇(Maven專案)

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&amp;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》》》》使用者完成任務》》》流程結束