整个项目的目录结构:
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/#