activiti入门列子一个简单的activiti请假流程

整个项目的目录结构:


pom.xml:


	4.0.0

	cn.zto
	myActiviti
	0.0.1-SNAPSHOT
	jar

	myActiviti
	http://maven.apache.org

	
		UTF-8
	

	
		
		
			org.activiti
			activiti-engine
			5.15.1
		
		
			org.activiti
			activiti-spring
			5.15.1
		
		
			org.activiti
			activiti-explorer
			5.15.1
		
		
		
			commons-dbcp
			commons-dbcp
			1.4
		
		
			mysql
			mysql-connector-java
			5.1.29
		
		
		
			org.springframework
			spring-core
			4.0.6.RELEASE
		
		
			org.springframework
			spring-beans
			4.0.6.RELEASE
		
		
			org.springframework
			spring-test
			4.0.6.RELEASE
		
		
			org.springframework
			spring-context
			4.0.6.RELEASE
		
		
			org.springframework
			spring-context-support
			4.0.6.RELEASE
		
		
			org.springframework
			spring-tx
			4.0.6.RELEASE
		
		
			org.springframework
			spring-orm
			4.0.6.RELEASE
		
		
		
			org.mybatis
			mybatis
			3.2.5
		
		
			org.mybatis
			mybatis-spring
			1.2.2
		
		
		
			junit
			junit
			4.11
		
		
		
			log4j
			log4j
			1.2.4
		
		
			org.slf4j
			slf4j-api
			1.7.6
		
		
			org.slf4j
			jcl-over-slf4j
			1.7.6
		
		
			org.slf4j
			slf4j-log4j12
			1.7.6
		
		
		
			org.apache.commons
			commons-lang3
			3.1
		
		
			commons-io
			commons-io
			2.4
		
		
			commons-fileupload
			commons-fileupload
			1.2.2
		
		
		
			javax.annotation
			javax.annotation-api
			1.2
		
		
			joda-time
			joda-time
			2.1
		
	


activiti.cfg.xml:



	
	
		
		
		
		
		
	


在 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获取流程引擎

	//通过activiti.cfg.xml获取流程引擎
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

 
  

通过源码可以看到  getDefaultProcessEngine方法会通过默认的activiti.cfg.xml文件名或者是activiti-context.xml文件名读取xml文件

当获取到的processEngine对象不为空时   就会在数据库创建关于activiti的23张表

具体作用如下:

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

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

此时你可以在数据库中看到act_ge_property表中插入了3条数据

将MyLeave.bpmn和MyLeave.png打包成myleave.zip文件(一定要是zip别压缩成rar)

执行以下方法,发布请假流程:

	/**
	 * 发布流程
	 * 发布流程后,流程文件会保存到数据库中
	 */
	@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 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 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 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/#


activiti的视频资料

 java学习路线-Java技术人员之路从初级到高级   里面有

你可能感兴趣的:(activiti)