activiti工作流可以用来开发OA系统的审批功能,比如请假审批,财务审批,公告审批等等审批功能,下面我将在ssm框架中(spring+springmvc+mybatis)整合我们的activiti工作流框架。

首先在maven项目的pom.xml文件中引入activiti工作流的jar包:

<dependency>  
	<groupId>org.activiti</groupId>  
	<artifactId>activiti-engine</artifactId>  
	<version>5.22.0</version>  
</dependency>  
		  
<dependency>  
	<groupId>org.activiti</groupId>  
	<artifactId>activiti-spring</artifactId>  
	<version>5.22.0</version>  
</dependency>

我们接着创建一个spring-activiti.xml的文件,用来注入spring的6个service服务,方便我们日后在controller层或者service层中注入这些service,配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

	<!-- 配置流程引擎配置信息对象 -->
	<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"
		p:dataSource-ref="dataSource"
		p:transactionManager-ref="transactionManager"
		p:databaseSchemaUpdate="true"
		p:jobExecutorActivate="false"
		p:databaseType="oracle"
  		p:activityFontName="宋体"
  		p:labelFontName="黑体"
  		p:xmlEncoding="utf-8"/>
  		
	<!-- 配置流程引擎 -->	
  	<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"
 	    p:processEngineConfiguration-ref="processEngineConfiguration"/>
		
	<!-- 配置六个服务Bean -->
	<bean id="repositoryService" factory-bean="processEngine" 
		factory-method="getRepositoryService" />
	<bean id="runtimeService" factory-bean="processEngine" 
			factory-method="getRuntimeService" />
	<bean id="taskService" factory-bean="processEngine" 
			factory-method="getTaskService" />
	<bean id="historyService" factory-bean="processEngine" 
			factory-method="getHistoryService" />
	<bean id="formService" factory-bean="processEngine" 
			factory-method="getFormService" />
	<bean id="identityService" factory-bean="processEngine" 
			factory-method="getIdentityService" /> 
	
</beans>

上面的activiti文件配置好之后我们在spring-context.xml文件中引用我们的activiti整合文件:

<import resource="spring-activiti.xml"/>

当activiti框架的jar包都下载完毕之后,我们就可以创建activiti项目所需要的数据表了,我们先来写一个测试类,用来生成数据表,本人用的是oracle数据库,所以jdbc驱动JdbcDriver是oracle数据库所需要的驱动。

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;

/**
 * 创建数据库表
 * @author JIAN WANG
 * @email wjycgl@163.com
 * @date 2016年11月7日 上午10:35:40
 * @version 1.0
 */
public class CreateDatabaseTest {
	public static void main(String[] args) {
		// 创建流程引擎配置信息对象
		ProcessEngineConfiguration pec = ProcessEngineConfiguration
					.createStandaloneProcessEngineConfiguration();
		// 设置数据库的类型
		pec.setDatabaseType("oracle");
		// 设置创建数据库的方式
		// ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE(true): 如果没有数据库表就会创建数据库表,有的话就修改表结构. 
		// ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE(false): 不会创建数据库表
		// ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP(create-drop): 先创建、再删除.
		pec.setDatabaseSchemaUpdate("true");
		// 设置数据库驱动
		pec.setJdbcDriver("oracle.jdbc.OracleDriver");
		// 设置jdbcURL
		pec.setJdbcUrl("jdbc:oracle:thin:@//218.16.125.265:2008/baruser");
		// 设置用户名
		pec.setJdbcUsername("dengnew");
		// 设置密码
		pec.setJdbcPassword("dengxxxx");		
		// 构建流程引擎对象
		ProcessEngine pe = pec.buildProcessEngine(); // 调用访方法才会创建数据表		
		// 调用close方法时,才会删除
		pe.close();
	}

}

我们的oa系统使用的是ssm三大框架,整合好activiti工作流之后,我们就可以开始开发activiti工作流项目了,activiti工作流框架其实是一个半成品项目,所以它自带了25张数据库表,而且它还有service层,可以在我们ssm框架整合好oa系统后,就可以直接@Autowired注入到我们的controller或者service层就可以了。

ssm三大框架整合activiti工作流的方法我们之前有写过,6个服务Bean也在整合时配置过,如下:

http://www.tpyyes.com/a/javaweb/2017/0107/36.html

activiti工作流6大service服务的介绍:

第一大服务:仓储服务activiti的RepositoryService

	//仓储服务
	@Autowired
	private RepositoryService repositoryService;

仓储服务可以用来部署我们的流程图,还可以创建我们的流程部署查询对象,用于查询刚刚部署的流程列表,便于我们管理流程,方法如下。

	//这个是部署流程的方法,流程图以inputStream流的形式传入	
	DeploymentBuilder builder = repositoryService.createDeployment();
	builder.name(process.getName());
	builder.addInputStream(fileName, inputStream);
	Deployment deployment = builder.deploy();
	//这个是流程部署列表查询的方法
	DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();
	//可以根据很多条件查询,我这是根据部署名称模糊查询
	List<Deployment> list = deploymentQuery.deploymentNameLike("%"+name+"%")

第二大服务:activiti运行时服务RuntimeService

	//运行时服务
	@Autowired
	private RuntimeService runtimeService;

运行时服务主要用来开启流程实例,一个流程实例对应多个任务,也就是多个流程节点,好比如请假审批是一个流程实例,部门主管,部门经理,总经理都是节点,我们开启服务是通过流程定义key或者流程定义id来开启的,方法如下:

	//首先根据部署id创建流程定义
	ProcessDefinition def = repositoryService.createProcessDefinitionQuery().
			deploymentId(form.getDeployId()).singleResult();
	//然后根据流程定义id或者key开启流程实例	
	ProcessInstance proInst = runtimeService.startProcessInstanceById(def.getId());

备注:当我们用仓储服务部署了流程图之后,就会产生一个流程部署id,一个流程部署id对应一个流程定义,一个流程定义对应多个流程实例,一个流程实例对应多个任务节点,这样的逻辑应该明白吧,打个比方就是我设计了一个手机图纸(流程定义),是可以供N多个人生产出手机并去使用的,这些人就是流程实例,手机里面的各种功能就是任务节点。

第三大服务:activiti任务服务TaskService

	//任务服务
	@Autowired
	private TaskService taskService;

任务服务是用来可以用来领取,完成,查询任务列表功能的,使用方法分别如下:

//根据任务id和用户领取任务
taskService.claim(String taskId, String userId)
//根据任务id完成自己节点的任务
taskService.complete(String taskId)
//创建任务查询对象之后根据候选人也就是任务处理人查询自己的任务列表
taskService.createTaskQuery().taskAssignee(String assignee)

第四大服务:activiti历史服务HistoryService

	//历史服务
	@Autowired
	private HistoryService historyService;

历史服务可以查看审批人曾经审批完成了哪些项目,审批项目总共花了多少时间,以及在哪个环节比较耗费时间等等,便于审批人查看历史信息,方法如下。

	//根据审批人查看该审批人审批了哪些项目
	List<HistoricTaskInstance> = historyService.createHistoricTaskInstanceQuery().
		taskAssignee(String assignee).finished().list();

历史任务对象HistoricTaskInstance,它里面封装了任务开始时间,结束时间,该节点花费的时间等等信息。

第五大服务:activiti表单服务FormService,注入方法是一样的,本人几乎没有用到,具体作用没有好好研究,以后使用了再公布出来。

	//表单服务
	@Autowired
	private FormService formService;

第六大服务:activiti实体服务IdentityService,主要是操作用户信息,用户分组信息等,组信息包括如部门表和职位表,我一般都是自己建表来存储用户信息和组信息的,

	//实体服务
	@Autowired
	private IdentityService identityService;

经过以上的简单了解,我想应该能基本入门和使用activiti工作流框架创建简单的oa系统项目了,注意注入的服务名必须和xml配置的六个服务bean的id一样,ssm框架整合配置在最开始的地方已经公布了网址。