activiti从入门到绝望
activiti从入门到绝望
废话不说,直接上手
第一步画流程图
流程图需要一个插件,网上找找如何下
点击用户请假,
点击经理审核
点击取消提交连线
提交连线
驳回连线
流程图差不多就这些了
保存以后把你的流程图改成.bpmn20.xml格式的文件
配置activiti.cfg.xml,默认加载activiti.cfg.xml,名字改了以后,需要手动加载
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!--
public static final String DB_SCHEMA_UPDATE_FALSE = "false";不能自动创建表,需要表存在
public static final String DB_SCHEMA_UPDATE_CREATE_DROP = "create-drop";先删除表再创建表
public static final String DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,自动创建表
processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
-->
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<!-- 连接数据的配置 -->
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf8"></property>
<property name="jdbcUsername" value="root"></property>
<property name="jdbcPassword" value="root"></property>
<!-- 没有表创建表 -->
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
pom文件
<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.bgxt</groupId>
<artifactId>Activiti</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>firstdemo</name>
<dependencies>
<!-- BPM引刑 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>6.0.0</version>
</dependency>
<!--日志记录-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.193</version>
</dependency>
<!--Mysql数据库驱动-->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.34</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- file工具类 -->
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
</dependencies>
</project>``
到这差不多环境搭好了
部署流程并进行测验
从上往下一个一个的测验,在流程中,只有当前流程走完以后,才会到下一流程中去,根据你所画的流程图去进行测试
/**加载配置文件创建数据库表*/
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**部署流程(classpath部署)*/
@Test
public void deploymentProcessDefinition_classpath() {
//获取流程引
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
Deployment deployment = processEngine.getRepositoryService()
.createDeployment()
.name("测试流程")//给流程取名
.addClasspathResource("Process2.bpmn20.xml")
.deploy();
System.out.println("部署ID"+deployment.getId());//2501
System.out.println("部署名称"+deployment.getName());
}
/**启动流程实例*/
@Test
public void startProcessInstance(){
String processDefinitionKey="Process";
//流程启动前设置流程变量
Map<String,Object> variables=new HashMap<String,Object>();
variables.put("userid", "张三");//这里userid user就是我们在流程图中的${userid},${user}
variables.put("user", "李四");
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey(processDefinitionKey, variables);
System.out.println("流程实例ID"+pi.getId());//5001
System.out.println("流程定义ID"+pi.getProcessDefinitionId());//Process:1:2504
}
/**查询当前人的任务*/
@Test
public void findPenroleTest(){
String assignee="李四";
List<Task> list = processEngine.getTaskService()
.createTaskQuery()
//查询条件
.taskAssignee(assignee)
// .taskCandidateUser(candidateUser)//组任务的办理人查询
// .processDefinitionId(processDefinitionId)//使用流程定义ID查询
// .processInstanceId(processInstanceId)//使用流程实例ID查询
// .executionId(executionId)//使用执行对象ID查询
//排序
.orderByTaskCreateTime().desc()//使用创建时间排序降序
//返回结果集
.list();
// .singleResult()//返回惟一结果集
// .count()//返回结果集的数量
// .listPage(firstResult, maxResults);//分页查询
if(list!=null && list.size()>0){
for (Task task : list) {
System.out.println("任务id"+task.getId());//5007
System.out.println("任务名称"+task.getName());
System.out.println("任务的创建时间"+task.getCreateTime());
System.out.println("任务的办理人"+task.getAssignee());
System.out.println("流程实例id"+task.getProcessInstanceId());//5001
System.out.println("执行对象ID:" + task.getExecutionId());//5004
System.out.println("流程定义ID:" + task.getProcessDefinitionId());//Process:1:2504
}
}
}
/**完成任务*/
@Test
public void completePersonalTask(){
String taskId="30003";
Map<String, Object> variables=new HashMap<String, Object>();
variables.put("miss","通过");//这里miss就是我们在连线上设置的${miss=="通过"}
processEngine.getTaskService()
.complete(taskId, variables);
System.out.println("任务完成:任务id"+taskId);
}
/**删除流程部署*/
@Test
public void deldeployment(){
//获取流程id
String deploymentId="2501";
//获取流程仓库
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.deleteDeployment(deploymentId, true);
}
/**查看流程部署*/
@Test
public void querydeploymentProcess(){
//获取仓库服务对象
List<ProcessDefinition> list = processEngine.getRepositoryService()
.createProcessDefinitionQuery()//定义流程查询对象
.orderByProcessDefinitionVersion().asc()//设置查询条件
.list();//返回结果集
if(list!=null&&list.size()>0){
for (ProcessDefinition pd : list) {
System.out.println("流程实例id:"+pd.getDeploymentId());
System.out.println("流程定义id:"+pd.getId());//流程定义id
System.out.println("name:"+pd.getName());//流程名称
System.out.println("Key:"+pd.getKey());
System.out.println("Version:"+pd.getVersion());//版本
System.out.println("ResourceName:"+pd.getResourceName());//加载的流程文件
}
}else{
System.out.println("没有流程");
}
}
/**查询历史流程实例*/
@Test
public void queryHistoric(){
String processDefinitionKey="Process";//部署流程时的key
List<HistoricProcessInstance> list = processEngine.getHistoryService()
.createHistoricProcessInstanceQuery()//创建历史流程实例查询
.processDefinitionKey(processDefinitionKey)
//查询条件
.orderByProcessInstanceStartTime().desc()//按照流程开始时间
.list();
for (HistoricProcessInstance hpi : list) {
System.out.println(hpi.getId());
System.out.println(hpi.getName());
System.out.println(hpi.getProcessDefinitionKey());
System.out.println(hpi.getDeploymentId());
System.out.println(hpi.getStartTime());
System.out.println(hpi.getEndTime());
}
}
/**展示流程图片
* @throws IOException */
@Test
public void selview() throws IOException{
String deploymentId="15001";//部署ID
RepositoryService repositoryService = processEngine.getRepositoryService();
List<String> namesImg = repositoryService.getDeploymentResourceNames(deploymentId);
String nameimg=null;
for (String name : namesImg) {
if(name.indexOf(".png")>0){
nameimg=name;
}
}
if(nameimg!=null){
System.out.println(nameimg);
//通过部署id和文件名得到文件输入流
InputStream in = processEngine.getRepositoryService()
.getResourceAsStream(deploymentId, nameimg);
File file=new File("e:/"+nameimg);
FileUtils.copyInputStreamToFile(in, file);
}
}