用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文件





具体作用如下:


跟详细的情况可以去下面这个地址了解:

http://www.cnblogs.com/llzgzljl/archive/2013/10/07/3356108.html

此时你可以在数据库中看到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://www.mossle.com/docs/activiti/#


博文原址为:http://blog.csdn.net/a67474506/article/details/38266129感谢原博主的博文,让我3个小时就搞明白,之前看了陆陆续续看了几个月的说明书,还是没有入门,看此文让我顿时明悟。原文没有附录项目源码,我顺手上传我的,希望能让帮助更多的朋友! 奋斗  


源码下载路径:http://download.csdn.net/detail/lvsehuoyan/7733429





猜你喜欢

转载自blog.csdn.net/lvsehuoyan/article/details/38408649