1. 程式人生 > >用activiti 工作流 實現簡單的請假 附帶原始碼

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

新建一個Maven專案

專案結構


pom.xml

<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.dengkun.activiti</groupId>
  <artifactId>Test1</artifactId>
  <version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>Test1Name</name>
  <description>Test1d</description>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencies>
		<dependency>
		  <groupId>org.vaadin.addons</groupId>
		  <artifactId>dcharts-widget</artifactId>
		  <version>0.10.0</version>
		  <type>jar</type>
		</dependency>
		<!-- Activiti -->
		<dependency>
			<groupId>org.activiti</groupId>
			<artifactId>activiti-engine</artifactId>
			<version>5.15.1</version>
		</dependency>
		<dependency>
			<groupId>org.activiti</groupId>
			<artifactId>activiti-spring</artifactId>
			<version>5.15.1</version>
		</dependency>
		<dependency>
			<groupId>org.activiti</groupId>
			<artifactId>activiti-explorer</artifactId>
			<version>5.15.1</version>
		</dependency>
		<!-- Database -->
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.29</version>
		</dependency>
		<!-- spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>4.0.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-beans</artifactId>
			<version>4.0.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>4.0.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>4.0.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>4.0.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>4.0.6.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>4.0.6.RELEASE</version>
		</dependency>
		<!-- mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.2.5</version>
		</dependency>
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.2</version>
		</dependency>
		<!-- junit -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
		</dependency>
		<!-- log -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.4</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.6</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>1.7.6</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.6</version>
		</dependency>
		<!-- commons -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.1</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.4</version>
		</dependency>
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.2.2</version>
		</dependency>
		<!-- other -->
		<dependency>
			<groupId>javax.annotation</groupId>
			<artifactId>javax.annotation-api</artifactId>
			<version>1.2</version>
		</dependency>
		<dependency>
			<groupId>joda-time</groupId>
			<artifactId>joda-time</artifactId>
			<version>2.1</version>
		</dependency>
		
	</dependencies>
</project>

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


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="jdbcUrl" value="jdbc:mysql:///myactiviti" />
		<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUsername" value="root" />
		<property name="jdbcPassword" value="123456" />
		<property name="databaseSchemaUpdate" value="true" />
	</bean>
</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張表,要保證資料庫連線正常。

public class App {
	public static void main(String[] arg){
		ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 
	}
}

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

具體作用如下:

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

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

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

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

MyTest.java

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

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

	/**
	 * 釋出流程
	 * 釋出流程後,流程檔案會儲存到資料庫中
	 */
	@Test
	public void deployFlow(){
		RepositoryService repositoryService = processEngine.getRepositoryService();
		
		//獲取在classpath下的流程檔案
		InputStream in = this.getClass().getClassLoader().getResourceAsStream("myleave.zip");
		ZipInputStream zipInputStream = new ZipInputStream(in);
		//使用deploy方法釋出流程
		repositoryService.createDeployment()
						 .addZipInputStream(zipInputStream)
						 .name("Myleave")
						 .deploy();
	}

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

 

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

	@Test
	public void queryProcdef(){
		RepositoryService repositoryService = processEngine.getRepositoryService();
		//建立查詢物件
		ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
		//新增查詢條件
		query.processDefinitionKey("myProcess");//通過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());
		}
	}

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

 

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

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

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

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

	/**
	 * 檢視任務
	 */
	@Test
	public void queryTask(){
		//獲取任務服務物件
		TaskService taskService = processEngine.getTaskService();
		//根據接受人獲取該使用者的任務
		List<Task> tasks = taskService.createTaskQuery()
									.taskAssignee("張三")
									.list();
		for (Task task : tasks) {
			System.out.println("ID:"+task.getId()+",姓名:"+task.getName()+",接收人:"+task.getAssignee()+",開始時間:"+task.getCreateTime());
		}
	}

提出請假申請,啟動流程
	@Test
	public void startTask(){
		TaskService taskService = processEngine.getTaskService();
		//taskId 就是查詢任務中的 ID
		String taskId = "204";
		//完成請假申請任務
		taskService.complete(taskId );
	}

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

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

	/**
	 * 檢視任務
	 */
	@Test
	public void queryTask(){
		//獲取任務服務物件
		TaskService taskService = processEngine.getTaskService();
		//根據接受人獲取該使用者的任務
		List<Task> tasks = taskService.createTaskQuery()
									.taskAssignee("老闆")
									.list();
		for (Task task : tasks) {
			System.out.println("ID:"+task.getId()+",姓名:"+task.getName()+",接收人:"+task.getAssignee()+",開始時間:"+task.getCreateTime());
		}
	}

	@Test
	public void startTask(){
		TaskService taskService = processEngine.getTaskService();
		//taskId 就是查詢任務中的 ID
		String taskId = "302";
		//完成請假申請任務
		taskService.complete(taskId );
	}

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

 

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

資料都是存放在資料庫中

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

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

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