java學習筆記——衆籌項目練習——工作流程框架Activiti5

                                     工作流程框架Activiti5

在我們實際的項目開發中,有時業務流程很複雜,類似的業務也很多。這樣我們開發起來就會很複雜。像我們練習的衆籌網項目中的資質認證模塊,開發時的功能不過就是簡單的增刪改查,可是業務流程很繁瑣,同時又有很多種情況。如果我們不使用工具自己來開發的話就會很麻煩!這時我們就需要使用工作流程框架啦!Activiti5正是工作流程框架中一個比較常用的開源框架。他可以使我們在開發複雜業務流程時非常簡單。

那我們這就先來簡單瞭解一下Activiti5如何使用吧!

 

 

 

 

 

 

 

工作流:

幾個概念:

 

定義(一種):

Person{

     String name;

     int age;

}

 

流程定義就是流程圖;

 

實例;(無數個)

new Person();

流程實例(多個)-啓動了某個流程;

 

流程定義 ProcessDefinition:定義某些流程的順序結構;定義一個流程;

流程實例 ProcessInstance:實例化一個流程,(啓動一次流程);

流程變量 Process variable:流程運行期間的一些數據

任務 Task:流程執行到的需要具體的執行一個任務(某個任務);

起始、結束(Start、End):流程的開始和結束;

網關( Gateway):控制流程的流轉方向;

 

ProcessEngine這個類是Activiti5的核心,所有的服務都需要通過ProcessEngine來創建,該類是線程安全的

Activiti5的持久化層採用的是Mybatis,這樣移植性好

Activiti5主要包括7個Service(7個服務組件),這些Service都是通過ProcessEngine創建

 

activiti5:

運行時表和流程結束的表進行分開處理;

運行期間經常進行一些CRUD;運行期間這些表中的數據總是很少,CRUD非常快;

流程運行期間數據以及信息存儲的表:

流程運行完成後的一些表:

 

activiti5如何和我們業務邏輯配合使用;

 

概念我瞭解的差不多啦!接下來我們看看如何使用。

1,安裝流程設計框架activiti5的插件。先解壓插件壓縮包,將壓縮包中的兩個文件夾拷貝到eclipse的安裝目錄下,然後重啓eclipse就可以啦!很簡單!

重啓eclipse後在新建中看看是否可以創建activiti項目?如果可以表示安裝成功!

2,測試。新建或者隨便找一個maven工程來測試activiti。

①,導包,在maven工程的pom文件中添加依賴。這裏也添加了mysql的依賴,因爲activiti也是需要數據庫保存數據的,我們要自定義activiti的數據保存在mysql中。

<!--測試activiti -->
    <dependencies>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-engine</artifactId>
            <version>5.22.0</version>
        </dependency>
        <!-- 導入mysql驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.42</version>
        </dependency>
    </dependencies>

②寫配置。在maven項目中創建spring的配置文件,拷貝相關配置信息並修改。創建源碼包,用於保存之後創建的流程設計文件。

上圖中mysql的配置,是爲了指定activiti將數據保存在mysql中,單獨新創建的activiti_db數據庫。

③,測試。

package com.atguigu.activiti.test;

import static org.junit.Assert.*;

import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.junit.Before;
import org.junit.Test;

public class ActivitiTest {

    // 引擎只有一個即可
    // 在類路徑下找一個activiti.cfg.xml的配置文件來初始化流程引擎
    //服務組件和流程引擎都是接口;
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService;
    RuntimeService runtimeService;
    RepositoryService repositoryService;
    ManagementService managementService;
    IdentityService identityService;
    HistoryService historyService;
    FormService formService;

    @Before
    public void serviceInit() {
        // 任務服務組件:完成任務,簽收任務等...
        taskService = processEngine.getTaskService();
        // 運行時服務組件:查詢流程運行期間一些信息,控制流程等
        runtimeService = processEngine.getRuntimeService();

        // 持久化服務組件:負責保存流程定義信息等
        repositoryService = processEngine.getRepositoryService();

        // 管理組件,監聽流程、定時任務等...
        managementService = processEngine.getManagementService();
        // 用戶模塊組件,CRUD一些用戶以及用戶分組等信息
        identityService = processEngine.getIdentityService();
        // 查詢流程歷史記錄等信息;歷史組件
        historyService = processEngine.getHistoryService();
        // 表單組件:沒用
        formService = processEngine.getFormService();
    }

    @Test
    public void test() {

          System.out.println("流程引擎:"+processEngine);
          System.out.println("其他組件:");
    }

}

 

1、流程框架第一次給數據庫中建表,這個表有數據;(存儲當前activiti版本信息等)

2、創建一個流程定義文件

3、在文件的空白處點一下;去properties標籤中可以填寫當前流程的一些定義(介紹)信息

5、畫流程圖:在流程定義文件中畫流程圖。

6、部署流程

 @Test
    public void testProcessDefinetionDeployee() {
        // 1、如何定義一個流程;(畫流程圖);
        // 2、部署這個定義好的流程;
        // 3、部署:去數據庫保存這個流程定義的信息
        Deployment deploy = repositoryService.createDeployment()
            .addClasspathResource("process/請假流程.bpmn")
            .deploy();

        System.out.println("部署的流程deploy對象"+deploy);
    }

 

一些通用信息;

保存了流程的文件、流程圖等信息

部署(流程部署信息的保存);部署的信息:某一天部署了什麼東西

procdef:Procecss Definetion:流程定義;

真正的id:;流程key:版本號:部署id

 

 

1、流程的啓動;

使用runtimeService;

任務表中就有任務;ru_task;

流程定義:ProcessDefinetion;流程信息保存;

流程實例:啓動某個流程就是爲這個流程創建一個流程實例;運行期間的數據都在ru表中

event_  流程期間的事件處理;

execution_:流程的運行信息

identitylink:和用戶有關

ru_job:其他任務;

ru_task:用戶要完成的任務;

ru_variable:流程變量;流程運行期間要用的數據;

 

2、任務的簽收和完成;

 taskService.claim(task.getId(), "zhangsan");簽收

taskService.complete(task.getId());完成

3、流程框架只是一個流程管理工具;

4、流程變量:流程運行期間的數據;

使用${}取出某些變量的值,用來做判斷,做任務派發等....

流程變量如果使用form表單申明的方式:變量的類型必須是以下幾種;

{date, boolean, string, double, long}

1)、員工申請:指派人:動態取得傳入的變量。

 

2)、網關;判斷走分支;

①,排他網關

相當於if()...else if();只會有一個分支到達。

選中網關與任務之間的連線後,可以填寫判斷條件。

這個規定數據不靠譜,我們一般也不用;以後都是跟業務邏輯走;

②,並行網關

必須等待所有的分支都完成,匯聚任務才能完成,自動進行下一步;(注意要有起始和匯聚成對出現)

 /**
     * 並行網關,必須所有匯聚點的分支都完成纔可以
     * @Description (TODO這裏用一句話描述這個方法的作用)
     */
    @Test
    // gov-process:1:87504
    public void test04() {
        List<Task> list = taskService.createTaskQuery().processDefinitionId("gov-process:1:87504").list();
        int i = 0;
        for (Task task : list) {
            System.out.println("任務信息:" + task.getId() + ";任務名:" + task.getName());
            // 完成任務
            taskService.complete(task.getId());
            //if ((i++) % 2 == 0) {
                // System.out.println("當前要完成的任務。"+task.getId() + ";任務名:" + task.getName());
                // taskService.complete(task.getId());
            //}
        }

//        List<HistoricProcessInstance> list2 = historyService.createHistoricProcessInstanceQuery().finished().list();
//        for (HistoricProcessInstance historicProcessInstance : list2) {
//            System.out.println(historicProcessInstance);
//        }
        //看這個流程是否完成了;
        long count = historyService.createHistoricProcessInstanceQuery().processDefinitionId("gov-process:1:87504").finished().count();
        System.out.println(count);
    }

③,包含網關;(並行+排他);

並行:滿足並行條件的分支走;

包含:

     滿足走的就走;並行

     還可以排他

 

這裏是所有聯繫的代碼:

import static org.junit.Assert.*;

import java.util.List;

import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentQuery;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.junit.Before;
import org.junit.Test;

public class ActivitiTest {

    // 引擎只有一個即可
    // 在類路徑下找一個activiti.cfg.xml的配置文件來初始化流程引擎
    // 服務組件和流程引擎都是接口;
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService;
    RuntimeService runtimeService;

    // 部署流程,查詢部署信息等...
    RepositoryService repositoryService;
    ManagementService managementService;
    IdentityService identityService;
    HistoryService historyService;
    FormService formService;

    @Before
    public void serviceInit() {
        // 任務服務組件:完成任務,簽收任務等...
        taskService = processEngine.getTaskService();
        // 運行時服務組件:查詢流程運行期間一些信息,控制流程等
        runtimeService = processEngine.getRuntimeService();

        // 持久化服務組件:負責保存流程定義信息等
        repositoryService = processEngine.getRepositoryService();

        // 管理組件,監聽流程、定時任務等...
        managementService = processEngine.getManagementService();
        // 用戶模塊組件,CRUD一些用戶以及用戶分組等信息
        identityService = processEngine.getIdentityService();
        // 查詢流程歷史記錄等信息;歷史組件
        historyService = processEngine.getHistoryService();
        // 表單組件:沒用
        formService = processEngine.getFormService();
    }

    @Test
    public void test() {

        System.out.println("流程引擎:" + processEngine);
        System.out.println("其他組件:");

    }

    /**
     * 測試來定義一個流程,並把流程的定義信息保存在數據庫中 1、每次流程圖有修改以後,我們都需要重新部署,流程引擎才能用到新的流程 2、以前舊的流程都是存儲在數據庫中,新的流程也要存在數據庫中
     * 3、每次部署都會保存一個新的流程定義;act_re_procdef 4、同一個流程多次部署相當於只是版本疊加; 5、流程定義的key是用來識別版本是否疊加的;
     * 
     * @Description (TODO這裏用一句話描述這個方法的作用)
     */
    @Test
    public void testProcessDefinetionDeployee() {
        // 1、如何定義一個流程;(畫流程圖);
        // 2、部署這個定義好的流程;
        // 3、部署:去數據庫保存這個流程定義的信息
        Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/請假流程新的.bpmn").deploy();

        System.out.println("部署的流程deploy對象" + deploy.getId());

    }

    /**
     * 查詢所有的流程信息repositoryService
     * 
     * @Description (TODO這裏用一句話描述這個方法的作用)
     */
    @Test
    public void testQueryProcessDefinetion() {
        // 查部署信息;
        // DeploymentQuery query = repositoryService.createDeploymentQuery();

        // 查流程定義;
        // 每次部署都有一個部署id:id=12501
        // 也可以用流程的唯一標示:id=myProcess01
        ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
        // 拿到所有數據庫中的流程定義信息
        long count = definitionQuery.count();
        System.out.println("流程數量:" + count);

        List<ProcessDefinition> list = definitionQuery.list();
        for (ProcessDefinition processDefinition : list) {
            System.out.println("流程id(流程框架生成的):" + processDefinition.getId());
            System.out.println("流程name(畫流程時的流程名):" + processDefinition.getName());
            System.out.println("流程的key(畫流程時的id):" + processDefinition.getKey());
            System.out.println("流程的資源信息:" + processDefinition.getResourceName() + "==>"
                    + processDefinition.getDiagramResourceName());
            System.out.println("流程的版本號:" + processDefinition.getVersion());
            System.out.println("=====================");
        }

        System.out.println("精確查詢......");
        // //按照流程的id;按照流程的key;按照流程的版本
        // ProcessDefinitionQuery d = definitionQuery.deploymentId("2501");
        // System.out.println(d);
        //
        long count2 = definitionQuery.processDefinitionKeyLike("myProcess").count();
        System.out.println(count2);
        // System.out.println("版本:"+definition.getVersion()+"==>"+definition.getKey()+"==>"+definition.getName());
    }

    /**
     * 一個流程定義可以創建多個流程實例;
     * 
     * processInstance.getProcessDefinitionId():
     * myProcess:4:7504
     * myProcess:4:7504
     * 
     * @Description (TODO這裏用一句話描述這個方法的作用)
     */
    @Test
    public void test04() {
        // 1、啓動一個請假流程;
        // 2、查出我們要啓動的流程的信息;
        ProcessDefinition definition = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("myProcess")
                .latestVersion().singleResult();
        System.out.println("流程的信息:"+definition.getId()+"==>"+definition.getName()+"===>"+definition.getKey());
        
        //3、啓動這個流程;返回流程實例
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(definition.getId());
        
        System.out.println("流程啓動成功!"+processInstance.getActivityId());
        System.out.println(""+processInstance.getProcessDefinitionId());
    }
    
    /**
     * 測試任務
     * @Description (TODO這裏用一句話描述這個方法的作用)
     * 1、查詢所有任務;
     * 2、將任務簽收;(領任務完成任務)
     */
    @Test
    public void testTask(){
        //1、查出當前系統有哪些任務;
        //可以查某個流程當前走在了哪個任務:createTaskQuery().processDefinitionId("");
        //可以查某個人現在需要做哪些任務;任務分配給了這些人;
        //某個流程對應的所有任務
        List<Task> list = taskService.createTaskQuery()
            .processDefinitionId("myProcess:4:7504")
            .list();
        for (Task task : list) {
            System.out.println("當前的任務信息:id:"+task.getId());
            System.out.println("任務分給哪個人(由哪個人來處理):"+task.getAssignee());
            System.out.println("任務名:"+task.getName());
            String assignee = "zhangsan";
            System.out.println("任務簽收;"+assignee+"簽收了:"+task.getId()+"");
            taskService.claim(task.getId(), "zhangsan");
            System.out.println("===================");
        }
        
        System.out.println("張三所要執行的任務...");
        List<Task> list2 = taskService.createTaskQuery().taskAssignee("zhangsan").list();
        for (Task task : list2) {
            System.out.println("當前的任務信息:id:"+task.getId());
            System.out.println("任務分給哪個人(由哪個人來處理):"+task.getAssignee());
            System.out.println("任務名:"+task.getName());
        }
    }
    
    /**
     * 1、任務相關操作都是使用taskService;
     * 2、claim、complete;簽收和完成
     * 測試完成任務
     * @Description (TODO這裏用一句話描述這個方法的作用)
     */
    @Test
    public void testTaskComplete(){
        //1、查出張三擁有的任務;
        long count1 = taskService.createTaskQuery().taskAssignee("zhangsan").count();
        System.out.println("任務數量:"+count1);
        System.out.println("=====================================");
        List<Task> list = taskService.createTaskQuery().taskAssignee("zhangsan").list();
        for (Task task : list) {
            //完成任務;
            System.out.println("當前的任務信息:id:"+task.getId());
            System.out.println("任務名:"+task.getName());
            System.out.println("張三:完成任務"+task.getId());
            taskService.complete(task.getId());
            
            
        }
        
        System.out.println("=====================================");
        long count = taskService.createTaskQuery().taskAssignee("zhangsan").count();
        System.out.println("任務數量:"+count);
    }
    
    @Test
    public void testProceTask(){
        //看當前流程執行到哪個任務了;
        List<Task> list = taskService.createTaskQuery().processDefinitionId("myProcess:4:7504").list();
        for (Task task : list) {
            System.out.println("當前的任務信息:id:"+task.getId());
            System.out.println("任務名:"+task.getName());
            taskService.complete(task.getId());
        }
        System.out.println("==================");
        
        
        List<Task> list2 = taskService.createTaskQuery().processDefinitionId("myProcess:4:7504").list();
        for (Task task : list2) {
            System.out.println("當前的任務信息:id:"+task.getId());
            System.out.println("任務名:"+task.getName());
            taskService.complete(task.getId());
        }
        
        System.out.println("==================");
        List<Task> list3 = taskService.createTaskQuery().processDefinitionId("myProcess:4:7504").list();
        for (Task task : list3) {
            System.out.println("當前的任務信息:id:"+task.getId());
            System.out.println("任務名:"+task.getName());
            //dsadsadsadsadsa
            
            taskService.complete(task.getId());
        }
        
    }    
 
}
import static org.junit.Assert.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

public class ActivitiTest02 {

    // 引擎只有一個即可
    // 在類路徑下找一個activiti.cfg.xml的配置文件來初始化流程引擎
    // 服務組件和流程引擎都是接口;
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService;
    RuntimeService runtimeService;

    // 部署流程,查詢部署信息等...
    RepositoryService repositoryService;
    ManagementService managementService;
    IdentityService identityService;
    HistoryService historyService;
    FormService formService;

    @Before
    public void serviceInit() {
        // 任務服務組件:完成任務,簽收任務等...
        taskService = processEngine.getTaskService();
        // 運行時服務組件:查詢流程運行期間一些信息,控制流程等
        runtimeService = processEngine.getRuntimeService();

        // 持久化服務組件:負責保存流程定義信息等
        repositoryService = processEngine.getRepositoryService();

        // 管理組件,監聽流程、定時任務等...
        managementService = processEngine.getManagementService();
        // 用戶模塊組件,CRUD一些用戶以及用戶分組等信息
        identityService = processEngine.getIdentityService();
        // 查詢流程歷史記錄等信息;歷史組件
        historyService = processEngine.getHistoryService();
        // 表單組件:沒用
        formService = processEngine.getFormService();
    }

    /**
     * 部署的信息:57501
     * 部署的信息:65001
     * 
     * @Description (TODO這裏用一句話描述這個方法的作用)
     */
    @Test
    public void test() {
        // 1、部署這個流程;
        Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/01請假的帶變量版.bpmn")
                .name("帶變量的流程部署").deploy();
        System.out.println("部署的信息:" + deploy.getId());
        System.out.println("" + deploy.getName());
    }

    /**
     * 流程啓動完成:ProcessInstance[77501]
     * @Description (TODO這裏用一句話描述這個方法的作用)
     */
    @Test
    public void testStart() {
        // 1、啓動新版的請假流程;myprocess001:1:57504
        //myprocess001:2:65004
        // 啓動時設置一些流程變量;方便下個任務可以獲取;60001
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("assigneer", "lisi");
        ProcessInstance processInstance = runtimeService.startProcessInstanceById("myprocess001:2:65004", map);
        System.out.println("流程啓動完成:"+processInstance);
    }
    
    @Test
    public void testTask01(){
        //1、使用lisi獲取到它要執行的任務
//        List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").list();
//        for (Task task : list) {
//            System.out.println("任務名:"+task.getName()+"==>"+task.getId());
//            
//        }
        Task task = taskService.createTaskQuery().processDefinitionId("myprocess001:2:65004").taskAssignee("lisi").singleResult();
        System.out.println("任務");
        //任務有指定人去處理就不用簽收;
        //強制簽收
//        taskService.unclaim(task.getId());
//        taskService.claim(taskId, userId);
        System.out.println("任務名:"+task.getName()+"==>"+task.getId());
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("days", 2);
       // map.put("reasons", "我病了");
        //map.put("requester", "lisi");
        taskService.complete(task.getId(), map);
        System.out.println("完成任務。。。");
    }
    
    @Test
    public void test01(){
        List<Task> list = taskService.createTaskQuery().processDefinitionId("myprocess001:2:65004").list();
        for (Task task : list) {
            System.out.println("任務名:"+task.getName()+"==>"+task.getId());
            
        }
        
        List<Task> list2 = taskService.createTaskQuery().taskAssignee("wangwu").list();
        for (Task task : list2) {
            System.out.println("任務名:"+task.getName()+"==>"+task.getId());
            taskService.complete(task.getId());
        }
        
        List<Task> list1 = taskService.createTaskQuery().processDefinitionId("myprocess001:2:65004").list();
        System.out.println("還有任務?"+list1);
    }

}
import static org.junit.Assert.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricProcessInstanceQuery;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

public class ActivitiTest03 {

    // 引擎只有一個即可
    // 在類路徑下找一個activiti.cfg.xml的配置文件來初始化流程引擎
    // 服務組件和流程引擎都是接口;
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService;
    RuntimeService runtimeService;

    // 部署流程,查詢部署信息等...
    RepositoryService repositoryService;
    ManagementService managementService;
    IdentityService identityService;
    HistoryService historyService;
    FormService formService;

    @Before
    public void serviceInit() {
        // 任務服務組件:完成任務,簽收任務等...
        taskService = processEngine.getTaskService();
        // 運行時服務組件:查詢流程運行期間一些信息,控制流程等
        runtimeService = processEngine.getRuntimeService();

        // 持久化服務組件:負責保存流程定義信息等
        repositoryService = processEngine.getRepositoryService();

        // 管理組件,監聽流程、定時任務等...
        managementService = processEngine.getManagementService();
        // 用戶模塊組件,CRUD一些用戶以及用戶分組等信息
        identityService = processEngine.getIdentityService();
        // 查詢流程歷史記錄等信息;歷史組件
        historyService = processEngine.getHistoryService();
        // 表單組件:沒用
        formService = processEngine.getFormService();
    }

    /**
     * 部署流程:部署的id:87501 流程定義的key:gov-process:1:87504
     * 
     * @Description (TODO這裏用一句話描述這個方法的作用)
     */
    @Test
    public void testDeploy() {
        Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/02政府審覈.bpmn").deploy();
        System.out.println("本次的部署信息" + deploy);
    }

    /**
     * 啓動流程實例
     * 
     * @Description (TODO這裏用一句話描述這個方法的作用)
     */
    @Test
    public void testStartProcessInstance() {
        // 1、查出所有流程,看哪一個是要啓動
        ProcessInstance processInstance = runtimeService.startProcessInstanceById("gov-process:1:87504");
        System.out.println("流程啓動成功!" + processInstance);
    }

    @Test
    public void testTaskAssignee() {
        List<Task> list = taskService.createTaskQuery().taskAssignee("leifengyang").list();
        for (Task task : list) {
            System.out.println("任務信息:" + task.getId() + ";任務名:" + task.getName());
            // 完成任務
            // ${isFoodCompany == true}
            // ${money>1000000}
            // ${isCurrent == true}
            Map<String, Object> variables = new HashMap<String, Object>();
            variables.put("isFoodCompany", true);
            variables.put("money", 1000001);
            variables.put("isCurrent", true);
            taskService.complete(task.getId(), variables);
        }
    }

    /**
     * 並行網關,必須所有匯聚點的分支都完成纔可以
     * @Description (TODO這裏用一句話描述這個方法的作用)
     */
    @Test
    // gov-process:1:87504
    public void test04() {
        List<Task> list = taskService.createTaskQuery().processDefinitionId("gov-process:1:87504").list();
        int i = 0;
        for (Task task : list) {
            System.out.println("任務信息:" + task.getId() + ";任務名:" + task.getName());
            // 完成任務
            taskService.complete(task.getId());
            //if ((i++) % 2 == 0) {
                // System.out.println("當前要完成的任務。"+task.getId() + ";任務名:" + task.getName());
                // taskService.complete(task.getId());
            //}
        }

//        List<HistoricProcessInstance> list2 = historyService.createHistoricProcessInstanceQuery().finished().list();
//        for (HistoricProcessInstance historicProcessInstance : list2) {
//            System.out.println(historicProcessInstance);
//        }
        //看這個流程是否完成了;
        long count = historyService.createHistoricProcessInstanceQuery().processDefinitionId("gov-process:1:87504").finished().count();
        System.out.println(count);
    }
    
    
}
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

public class ActivitiTest04 {

    // 引擎只有一個即可
    // 在類路徑下找一個activiti.cfg.xml的配置文件來初始化流程引擎
    // 服務組件和流程引擎都是接口;
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    TaskService taskService;
    RuntimeService runtimeService;

    // 部署流程,查詢部署信息等...
    RepositoryService repositoryService;
    ManagementService managementService;
    IdentityService identityService;
    HistoryService historyService;
    FormService formService;

    @Before
    public void serviceInit() {
        // 任務服務組件:完成任務,簽收任務等...
        taskService = processEngine.getTaskService();
        // 運行時服務組件:查詢流程運行期間一些信息,控制流程等
        runtimeService = processEngine.getRuntimeService();

        // 持久化服務組件:負責保存流程定義信息等
        repositoryService = processEngine.getRepositoryService();

        // 管理組件,監聽流程、定時任務等...
        managementService = processEngine.getManagementService();
        // 用戶模塊組件,CRUD一些用戶以及用戶分組等信息
        identityService = processEngine.getIdentityService();
        // 查詢流程歷史記錄等信息;歷史組件
        historyService = processEngine.getHistoryService();
        // 表單組件:沒用
        formService = processEngine.getFormService();
    }

    /**
     * pd:gov-process:2:100004 pd:gov-process:3:105004
     * 
     * @Description (TODO這裏用一句話描述這個方法的作用)
     */
    @Test
    public void testDeploy() {
        Deployment deploy = repositoryService.createDeployment().addClasspathResource("process/03政府審覈.bpmn").deploy();
        System.out.println(deploy + "部署完成");
    }

    // 流程啓動:ProcessInstance[102501]
    @Test
    public void startProcess() {
        ProcessInstance instance = runtimeService.startProcessInstanceById("gov-process:3:105004");
        System.out.println("流程啓動:" + instance);
    }

    @Test
    public void testTask() {
        // 1、查詢流程有哪些任務
        List<Task> pdTaskList = taskService.createTaskQuery().processDefinitionId("gov-process:3:105004").list();
        System.out.println("流程任務:" + pdTaskList);
        // 2、查詢你有哪些任務
        List<Task> perTaskList = taskService.createTaskQuery().taskAssignee("admin").list();
        System.out.println("admin我的任務");
        for (Task task : perTaskList) {
            System.out.println(task);

            // 完成任務;
            if (task.getId().equals("107504")) {
                Map<String, Object> variables = new HashMap<String, Object>();
                variables.put("money", 10001);
                variables.put("mone", 10001);
                // taskService.complete(task.getId(), variables);
                System.out.println("完成任務:" + task);
            }
        }
    }

    @Test
    public void testCompletion() {
        List<Task> pdTaskList = taskService.createTaskQuery().processDefinitionId("gov-process:3:105004").list();
        System.out.println("流程任務:" + pdTaskList);
        for (Task task : pdTaskList) {
            System.out.println("完成任務:"+task);
           // if(task.getId().equals("115007")){
                taskService.complete(task.getId());
           // }
        }
        
        //查詢這個流程是否執行完成了
        long count = historyService.createHistoricProcessInstanceQuery().processDefinitionId("gov-process:3:105004").finished().count();
        System.out.println("完成了?"+count);
       
    }

}

 

這裏還有activiti5的插件和用戶手冊的壓縮包地址:https://download.csdn.net/download/qq_25106373/11246793

供大家方便下載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章