1. 程式人生 > >用activiti 工作流 實現簡單的請假 附帶原始碼 / SSM整合Activiti工作流(不錯,可以看看)

用activiti 工作流 實現簡單的請假 附帶原始碼 / SSM整合Activiti工作流(不錯,可以看看)

http://blog.csdn.net/lvsehuoyan/article/details/38408649

新建一個Maven專案

專案結構

pom.xml

  1. <projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3.     <modelVersion>4.0.0</modelVersion
    >
  4.     <groupId>com.dengkun.activiti</groupId>
  5.   <artifactId>Test1</artifactId>
  6.   <version>0.0.1-SNAPSHOT</version>
  7.     <packaging>jar</packaging>
  8.     <name>Test1Name</name>
  9.   <description>Test1d</description>
  10.     <properties>
  11.         <
    project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  12.     </properties>
  13.     <dependencies>
  14.         <dependency>
  15.           <groupId>org.vaadin.addons</groupId>
  16.           <artifactId>dcharts-widget</artifactId>
  17.           <version>0.10.0</version
    >
  18.           <type>jar</type>
  19.         </dependency>
  20.         <!-- Activiti -->
  21.         <dependency>
  22.             <groupId>org.activiti</groupId>
  23.             <artifactId>activiti-engine</artifactId>
  24.             <version>5.15.1</version>
  25.         </dependency>
  26.         <dependency>
  27.             <groupId>org.activiti</groupId>
  28.             <artifactId>activiti-spring</artifactId>
  29.             <version>5.15.1</version>
  30.         </dependency>
  31.         <dependency>
  32.             <groupId>org.activiti</groupId>
  33.             <artifactId>activiti-explorer</artifactId>
  34.             <version>5.15.1</version>
  35.         </dependency>
  36.         <!-- Database -->
  37.         <dependency>
  38.             <groupId>commons-dbcp</groupId>
  39.             <artifactId>commons-dbcp</artifactId>
  40.             <version>1.4</version>
  41.         </dependency>
  42.         <dependency>
  43.             <groupId>mysql</groupId>
  44.             <artifactId>mysql-connector-java</artifactId>
  45.             <version>5.1.29</version>
  46.         </dependency>
  47.         <!-- spring -->
  48.         <dependency>
  49.             <groupId>org.springframework</groupId>
  50.             <artifactId>spring-core</artifactId>
  51.             <version>4.0.6.RELEASE</version>
  52.         </dependency>
  53.         <dependency>
  54.             <groupId>org.springframework</groupId>
  55.             <artifactId>spring-beans</artifactId>
  56.             <version>4.0.6.RELEASE</version>
  57.         </dependency>
  58.         <dependency>
  59.             <groupId>org.springframework</groupId>
  60.             <artifactId>spring-test</artifactId>
  61.             <version>4.0.6.RELEASE</version>
  62.         </dependency>
  63.         <dependency>
  64.             <groupId>org.springframework</groupId>
  65.             <artifactId>spring-context</artifactId>
  66.             <version>4.0.6.RELEASE</version>
  67.         </dependency>
  68.         <dependency>
  69.             <groupId>org.springframework</groupId>
  70.             <artifactId>spring-context-support</artifactId>
  71.             <version>4.0.6.RELEASE</version>
  72.         </dependency>
  73.         <dependency>
  74.             <groupId>org.springframework</groupId>
  75.             <artifactId>spring-tx</artifactId>
  76.             <version>4.0.6.RELEASE</version>
  77.         </dependency>
  78.         <dependency>
  79.             <groupId>org.springframework</groupId>
  80.             <artifactId>spring-orm</artifactId>
  81.             <version>4.0.6.RELEASE</version>
  82.         </dependency>
  83.         <!-- mybatis -->
  84.         <dependency>
  85.             <groupId>org.mybatis</groupId>
  86.             <artifactId>mybatis</artifactId>
  87.             <version>3.2.5</version>
  88.         </dependency>
  89.         <dependency>
  90.             <groupId>org.mybatis</groupId>
  91.             <artifactId>mybatis-spring</artifactId>
  92.             <version>1.2.2</version>
  93.         </dependency>
  94.         <!-- junit -->
  95.         <dependency>
  96.             <groupId>junit</groupId>
  97.             <artifactId>junit</artifactId>
  98.             <version>4.11</version>
  99.         </dependency>
  100.         <!-- log -->
  101.         <dependency>
  102.             <groupId>log4j</groupId>
  103.             <artifactId>log4j</artifactId>
  104.             <version>1.2.4</version>
  105.         </dependency>
  106.         <dependency>
  107.             <groupId>org.slf4j</groupId>
  108.             <artifactId>slf4j-api</artifactId>
  109.             <version>1.7.6</version>
  110.         </dependency>
  111.         <dependency>
  112.             <groupId>org.slf4j</groupId>
  113.             <artifactId>jcl-over-slf4j</artifactId>
  114.             <version>1.7.6</version>
  115.         </dependency>
  116.         <dependency>
  117.             <groupId>org.slf4j</groupId>
  118.             <artifactId>slf4j-log4j12</artifactId>
  119.             <version>1.7.6</version>
  120.         </dependency>
  121.         <!-- commons -->
  122.         <dependency>
  123.             <groupId>org.apache.commons</groupId>
  124.             <artifactId>commons-lang3</artifactId>
  125.             <version>3.1</version>
  126.         </dependency>
  127.         <dependency>
  128.             <groupId>commons-io</groupId>
  129.             <artifactId>commons-io</artifactId>
  130.             <version>2.4</version>
  131.         </dependency>
  132.         <dependency>
  133.             <groupId>commons-fileupload</groupId>
  134.             <artifactId>commons-fileupload</artifactId>
  135.             <version>1.2.2</version>
  136.         </dependency>
  137.         <!-- other -->
  138.         <dependency>
  139.             <groupId>javax.annotation</groupId>
  140.             <artifactId>javax.annotation-api</artifactId>
  141.             <version>1.2</version>
  142.         </dependency>
  143.         <dependency>
  144.             <groupId>joda-time</groupId>
  145.             <artifactId>joda-time</artifactId>
  146.             <version>2.1</version>
  147.         </dependency>
  148.     </dependencies>
  149. </project>

本人使用的是開源中國的庫dcharts-widget  路徑不同,所以要複製到本地的私服庫,注意名字不能錯。(  http://download.csdn.NET/detail/lvsehuoyan/9555324)


activiti.cfg.xml:

  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <beansxmlns="http://www.springframework.org/schema/beans"
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.     xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">
  5.     <beanid="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
  6.         <propertyname="jdbcUrl"value="jdbc:mysql:///myactiviti"/>
  7.         <propertyname="jdbcDriver"value="com.mysql.jdbc.Driver"/>
  8.         <propertyname="jdbcUsername"value="root"/>
  9.         <propertyname="jdbcPassword"value="123456"/>
  10.         <propertyname="databaseSchemaUpdate"value="true"/>
  11.     </bean>
  12. </beans>

在 resource 下新建Activiti Diagram

可以通過這個地址安裝外掛  《Activiti BPMN 2.0 designer - http://activiti.org/designer/update/ 》(如果是公司需要代理才能連線外網,請注意設定代理)

將UserTask分別修改成入下圖所示

修改好ID 和 NAME然後在修改Main config中的Assignee,員工請假修改為張三,老闆審批修改為老闆

點選Window--->Preferences--->Activiti--->Save Actions:將Create process definition image when saving the diagram勾選

然後儲存bpmn檔案的時候會自動幫你截圖

通過ProcessEngines.getDefaultProcessEngine獲取流程引擎

注:請先在MySQL建立資料庫myactiviti,使用預設設定即可,然後執行App.Java 中的main函式,當獲取到的processEngine物件不為空時   就會在資料庫建立關於activiti的23張表,要保證資料庫連線正常。

  1. publicclass App {  
  2.     publicstaticvoid main(String[] arg){  
  3.         ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();   
  4.     }  
  5. }  

通過原始碼可以看到  getDefaultProcessEngine方法會通過預設的activiti.cfg.xml檔名或者是activiti-context.xml檔名讀取xml檔案

具體作用如下:

跟詳細的情況可以去下面這個地址瞭解:

此時你可以在資料庫中看到act_ge_property表中插入了3條資料

將MyLeave.bpmn和MyLeave.png打包成myleave.zip檔案(一定要是zip別壓縮成rar)

執行以下方法,釋出請假流程:

MyTest.java

附錄的專案的程式碼,建議執行一個函式看下資料庫再執行下一個,能比較快速上手資料庫。

注:保證資料庫連結正常,否則processEngine會報空指標。

  1. /** 
  2.  * 釋出流程 
  3.  * 釋出流程後,流程檔案會儲存到資料庫中 
  4.  */
  5. @Test
  6. publicvoid deployFlow(){  
  7.     RepositoryService repositoryService = processEngine.getRepositoryService();  
  8.     //獲取在classpath下的流程檔案
  9.     InputStream in = this.getClass().getClassLoader().getResourceAsStream("myleave.zip");  
  10.     ZipInputStream zipInputStream = new ZipInputStream(in);  
  11.     //使用deploy方法釋出流程
  12.     repositoryService.createDeployment()  
  13.                      .addZipInputStream(zipInputStream)  
  14.                      .name("Myleave")  
  15.                      .deploy();  
  16. }  

檢視資料庫  釋出的流程檔案資訊會儲存在下面的三張表中:

 

我們可以通過RepositoryService獲取詳細的流程定義資訊

  1. @Test  
  2. public void queryProcdef(){  
  3.     RepositoryService repositoryService = processEngine.getRepositoryService();  
  4.     //建立查詢物件  
  5.     ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();  
  6.     //新增查詢條件  
  7.     query.processDefinitionKey("myProcess");//通過key獲取  
  8.         // .processDefinitionName("My process")//通過name獲取  
  9.         // .orderByProcessDefinitionId()//根據ID排序  
  10.     //執行查詢獲取流程定義明細  
  11.     List<ProcessDefinition>pds = query.list();  
  12.     for (ProcessDefinition pd : pds) {  
  13.         System.out.println("ID:"+pd.getId()+",NAME:"+pd.getName()+",KEY:"+pd.getKey()+",VERSION:"+pd.getVersion()+",RESOURCE_NAME:"+pd.getResourceName()+",DGRM_RESOURCE_NAME:"+pd.getDiagramResourceName());  
  14.     }  
  15. }  

key 和 name 就是我們原先畫bpmn時候宣告的:

 

使用流程定義的Key釋出一個請假流程:

  1. /** 
  2.      * 釋出流程 
  3.      */
  4.     @Test
  5.     publicvoid startFlow(){  
  6.         RuntimeService runtimeService = processEngine.getRuntimeService();  
  7.         /** 
  8.          * 啟動請假單流程  並獲取流程例項 
  9.          * 因為該請假單流程可以會啟動多個所以每啟動一個請假單流程都會在資料庫中插入一條新版本的流程資料 
  10.          * 通過key啟動的流程就是當前key下最新版本的流程 
  11.          *  
  12.          */
  13.         ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess");  
  14.         System.out.println("id:"+processInstance.getId()+",activitiId:"+processInstance.getActivityId());  
  15.     }  

流程釋出後在  act_ru_task ,act_ru_execution, act_ru_identitylink 表中插入流程資料

接下來就可以通過使用者ID去檢視該使用者的任務了

  1. /** 
  2.  * 檢視任務 
  3.  */
  4. @Test
  5. publicvoid queryTask(){  
  6.     //獲取任務服務物件
  7.     TaskService taskService = processEngine.getTaskService();  
  8.     //根據接受人獲取該使用者的任務
  9.     List<Task> tasks = taskService.createTaskQuery()  
  10.                                 .taskAssignee("張三")  
  11.                                 .list();  
  12.     for (Task task : tasks) {  
  13.         System.out.println("ID:"+task.getId()+",姓名:"+task.getName()+",接收人:"+task.getAssignee()+",開始時間:"+task.getCreateTime());  
  14.     }  
  15. }  

提出請假申請,啟動流程
  1. @Test
  2. publicvoid startTask(){  
  3.     TaskService taskService = processEngine.getTaskService();  
  4.     //taskId 就是查詢任務中的 ID
  5.     String taskId = "204";  
  6.     //完成請假申請任務
  7.     taskService.complete(taskId );  
  8. }  

檢視資料庫變化 可以看到 表中的資料已經變成了老闆審批相關資料

老闆檢視任務 ,並審批請假

  1. /** 
  2.  * 檢視任務 
  3.  */
  4. @Test
  5. publicvoid queryTask(){  
  6.     //獲取任務服務物件
  7.     TaskService taskService = processEngine.getTaskService();  
  8.     //根據接受人獲取該使用者的任務
  9.     List<Task> tasks = taskService.createTaskQuery()  
  10.                                 .taskAssignee("老闆")  
  11.                                 .list();  
  12.     for (Task task : tasks) {  
  13.         System.out.println("ID:"+task.getId()+",姓名:"+task.getName()+",接收人:"+task.getAssignee()+",開始時間:"+task.getCreateTime());  
  14.     }  
  15. }  

  1. @Test
  2. publicvoid startTask(){  
  3.     TaskService taskService = processEngine.getTaskService();  
  4.     //taskId 就是查詢任務中的 ID
  5.     String taskId = "302";  
  6.     //完成請假申請任務
  7.     taskService.complete(taskId );  
  8. }  

流程完畢,可以再act_hi_actinst表中看到整個請假流程

 

整個流程的過程是  1.釋出流程 --->2.啟動流程--->3.相關人檢視任務完成並完成

資料都是存放在資料庫中

具體詳情可以檢視Activiti 使用者手冊

博文原址為:http://blog.csdn.net/a67474506/article/details/38266129感謝原博主的博文,讓我3個小時就搞明白,之前看了陸陸續續看了幾個月的說明書,還是沒有入門,看此文讓我頓時明悟。原文沒有附錄專案原始碼,我順手上傳我的,希望能讓幫助更多的朋友!奮鬥  

原始碼下載路徑:http://download.csdn.net/detail/lvsehuoyan/7733429

======================================================================================================

http://blog.csdn.net/lovemenghaibin/article/details/50569606

在工作流中,我們一切工作流的基本就是工作引擎(ProcessEngine),繼承於EngineService介面,包括流程部署,資料庫連線都是靠著ProcessEngine來實現的。而ProcessEngineConfiguration:流程引擎配置,可以設定資料庫等,預設的資料庫是h2,持久化實現使用的Mybatis,這裡我們用的是MySQL

       那麼既然無論是jbpm或者是activiti都需要ProcessEngine來驅動,那麼我們就說一下工作流引擎的使用吧。

       流程部署

       當我們將我們的業務畫成圖的時候,然後利用工作流引擎部署,也就是將我們的流程圖資訊放到資料庫,圖和程式碼如下:

        

  1. /**部署流程定義*/
  2.     @Test
  3.     publicvoid deploymentProcessDefinition(){  
  4.         Deployment deployment = processEngine.getRepositoryService()  //用於流程定義和部署相關物件的Service
  5.                         .createDeployment()   //建立一個部署物件
  6.                         .name("leaveBill部門程式")  
  7.                         .addClasspathResource("diagrams/LeaveBill.bpmn"//從ClassPath資源中載入,一次只能載入一個檔案
  8.                         .addClasspathResource("diagrams/LeaveBill.png")  //從ClassPath資源中載入,一次只能載入一個檔案
  9.                         .deploy();  
  10.         System.out.println("deployment" + deployment.getId());   //1
  11.         System.out.println("deployment" + deployment.getName());//部門程式
  12.     }  
      列印結果如下:

      deployment1
      deploymenthellworld部門程式

      資料庫(部署相關表)解析

      我們看一下資料庫的表會發現,每次部署都是涉及的那三張表,act_re_deployment(流程部署表)

      該表包含了流程部署的名稱,ID,和部署時間

         act_re_procdef(流程定義表)

      該表有流程定義的主鍵key,版本(version)原始檔名和圖示,還有流程定義ID(key + 版本號+隨機生成的數字)

     act_ge_bytearray(資原始檔表)    

       儲存了資源的位置和儲存方式和部署ID,版本號ID等資訊

      act_ge_property:主鍵生成策略表

         定義了主鍵生成的策略資訊

        執行流程

        顧名思義,就是當我們有一個人開始申請請假的時候我們就要執行該請假的流程例項了

  1. /** 
  2.  * 執行流程例項 
  3.  */
  4. @Test
  5. publicvoid startProcessInstance(){  
  6.     String processInstanceKey = "LeaveBill";  
  7.     ProcessInstance pi = processEngine.getRuntimeService()  
  8.                         .startProcessInstanceByKey(processInstanceKey);  
  9.     System.out.println("流程例項id:" + pi.getId());  //流程例項id  101
  10.     System.out.println("流程定義id:" + pi.getProcessDefinitionId());   //流程定義ID helloworld:1:4
  11. }  
        這樣我們的流程例項就啟動起來了,那麼接下來我們看一下在啟動流程例項的時候我們涉及到的表資訊

      資料庫分析(例項表)分析

       act_ru_execution: 正在執行的執行物件表,側重流程例項,物件,任務

       包含了例項ID,流程定義ID,要執行的任務名稱(usertask1)等資訊

       act_ru_task:正在執行的任務表,對具體的任務而言,任務執行到哪裡了

      

     act_ru_identitylink流程資訊變數act_hi_taskinst:已經執行完的歷史任務資訊

相關推薦

activiti 工作 實現簡單請假 附帶原始碼 / SSM整合Activiti工作(不錯可以看看)

http://blog.csdn.net/lvsehuoyan/article/details/38408649 新建一個Maven專案 專案結構 pom.xml <projectxmlns="http://maven.apache.org/POM/4.0.0"

activiti 工作 實現簡單請假 附帶原始碼

新建一個Maven專案 專案結構 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

Activiti(二)簡單請假流程實現

在SpringBoot2整合Activiti6的環境中,實現簡單的請假流程。編寫請假業務流程。流程業務為: 1,員工請假,先建立請假流程 2,員工填寫請假申請,也可以不填寫,直接結束流程 3,提交給直接主管審批,如果直接主管拒絕,則重新填寫,如果直接主管同意,再到部門主

Python tkinter 實現簡單登陸註冊 基於B/S三層體系結構實現戶身份驗證

cte cursor 實現簡單 結果 pass 分享圖片 not null for 技術 Python tkinter 實現簡單登陸註冊 最終效果 開始界面 ? 註冊 登陸 ? 源碼 login.py # encoding=utf-8 f

DataTable中使用Compute 實現簡單的DataTable資料的統計.....

呼叫格式: object DataTable.Compute(string expression,string filter); 引數:expression:要計算的表示式filter:要計算表示式的過濾條件例:(C#)        object objSum=DataTa

java中利用IO實現簡單的圖書管理系統(利用陣列和IO實現

這個案例,主要對陣列及IO流進行總結! 利用IO流實現簡單的圖書管理系統,在控制檯上列印! 功能:1,檢視所有書籍   2,新增書籍 3,刪除書籍 4,修改書籍 5,退出 package com.baojian.bookStore; import java.io.Buf

【java】IO 實現簡單的複製功能

package ioTest; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import

MVC設計模式實現簡單的JavaWeb登入註冊功能

MVC 全稱Model(模型)-View(檢視)-Controller(控制器),這是一種開發模式,他的好處是可以將介面和業務邏輯分離。 Model(模型),是程式的主體部分,主要包含業務資料和業務邏輯。在模型層,還會涉及到使用者釋出的服務,在服務中會根據不

可變引數列表實現簡單的printf函式

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<stdarg.h> void print_num(int n) { if (

MIPS:系統功能呼叫實現簡單輸入輸出

實驗目的:熟悉MIPS的指令,掌握簡單的彙編程式結構。 實驗內容:利用系統功能呼叫從鍵盤輸入,轉換後在螢幕上顯示,具體要求如下: (1) 如果輸入的是字母(A~Z,不區分大小寫)或數字(0~9),則將其轉換成對應的英文單詞後在螢幕上顯示,對應關係見下表 (2) 若輸入的不是

Android兩張圖片實現簡單動畫效果

直接在java程式碼裡寫圖片佈局,而不用XML檔案。 先宣告定義: ImageView imageviewsudubg; ImageView imageviewsudu; LinearLayout l

Python3下tkinter和PIL實現簡單的顯示圖片

想做看圖工具的,必然要支援jpg、png等常見格式,但tkinter是個純粹的GUI庫,不像GTK、QT那樣大而全,所以只支援gif和ppm兩種格式,侷限很大,必須搭配影象處理庫,才能實現基本的看圖功能 在python生態系統裡,最常用的影象處理庫是PI

AndroidSharedPreferences儲存資料實現註冊和登入功能(首次安裝預設開啟註冊記住密碼)

註冊介面xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

Activiti】從入門到放棄——專案實戰之整合Activiti-Modeler

引入 在activiti-explorer中,我們可以在Eclipse中設計完成了流程,然後匯入流程模型,也可以通過線上流程設計器進行設計,然後部署得到流程模型。然後把流程模型部署得到流程定義。 實際上客戶是可能不會使用Eclipse的,所以我們必須在專案中整合線上流程設計器。整合

SSM整合Activiti 之 遇坑填坑(一)

SSM整合Activiti 測試的時候報錯元素型別為 “when” 的內容必須匹配 “(include|trim|where|set|foreach|choose|if)”。 報錯資訊: Excepti

使用SSM整合activiti遇到的坑

  做工作流相關的專案的時候,需要整合到框架裡面,選定activiti 工作流引擎,公司現用的框架是SpringMVC+Mybatis,整合工作流引擎的時候,後臺一直報:找了大半天,一直找不到問題所在,網上各種百度,無意間看見一句話,說是一定要保證資料庫連線正確,否則會報空指

Shiro實現(一): SSM整合筆記實現登入授權功能

開篇 本專案已經上傳github,建議對照程式碼理解 本篇主要講Shiro框架與SSM框架結合,實現登入和授權功能 利用spring 的aop切面思想,很簡單得融合Shiro許可權框架 程式碼 需要明白兩個點: 通過Subject.login() 登入成

基於狀態模式的簡單工作實現

工作流技術(Workflow) 是工作流程的計算模型,即將工作流程中的工作如何前後組織在一起的邏輯和規則在計算機中以恰當的模型進行表示,並對其實施計算。工作流要解決的主要問題是:為實現某個業務目標,在多個參與者之間,利用計算機,按某種預定規則自動傳遞文件、資訊

Activiti工作實現檢視流程圖圖片並在當前流程上新增紅圈

為什麼要用Activiti工作流以及Acitiviti工作流的基礎用法就不多說了,廢話不多說,直接上程式碼(呼叫該方法,頁面使用img標籤即可)package com.supermap.zzsubcorp.iPark.assetsMetaDataEngine.activiti

javaServerSocket類結合io實現一對一聊天(java實現簡單的TCP聊天程式只能telnet連線後方可使用)

粗略寫了點程式碼,其實這種在流的實現方式裡面可以用好多種不同流方面的類,我這沒用最簡單的,而是那邊弄個流這邊弄個流,好讓自己熟悉不同流的類,希望大家別繞暈哈。可能對新手會有點繞,不過久了應該就會了,程