因为现在所处的公司要实现一个流程的审批,也是因为以前有过一些Activiti工作流的使用经验,所以我选择了Activiti工作流,不同的是以前是一个已有的框架,只会用一些流程的执行而不知道为什么这么用,而现在要学习怎么用,特别感谢一位大佬的博客。
https://blog.csdn.net/zjx86320/article/category/6294649
从零开始引入Activiti我是这样做的
第一步
下载Activiti工作流
官网:https://www.activiti.org/download-links
下载后目录结构如下:
在database中找到对应数据库SQL至数据库建表,我下载的版本建了28张表。
第二步
把libs中包导至项目中(包中含el表达式会和tomcat的lib中的冲突),通过maven导入,获修改tomcat中的el表达式源码
<!--工作流,去除依赖,因为和tomcat的jar冲突 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>6.0.0</version>
<exclusions>
<exclusion>
<groupId>de.odysseus.juel</groupId>
<artifactId>juel-spi</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>6.0.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.3.170</version>
<scope>test</scope>
</dependency>
我后来采取的maven
第三步
配置activiti-context-xml文件 或 activiti-cfg-xml 文件,简单看了一下源码,中间有明确写到文件名,应该是不能用其他名字的
源码中也是有方法可以传入String来加载ProcessEngine(最核心的类)的,所有其他类基本都由它来生产。
获取的方式是
private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
activiti-context-xml文件如下
<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="dbProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:jdbc.properties"/>
<property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>-->
<!--数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/newssm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
<!--事物管理-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--创建流程引擎对象-->
<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
<property name="dataSource" ref="dataSource"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="databaseSchemaUpdate" value="true"/>
<property name="mailServerHost" value="localhost"/>
<property name="mailServerPort" value="5025"/>
</bean>
<!--流程引擎配置-->
<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
<property name="processEngineConfiguration" ref="processEngineConfiguration"/>
</bean>
</beans>
下面是一些简单的测试方法,可转化为静态方法使用。
package com.cjdjyf.newssm.utils;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author : cjd
* @description :
* @date : 2018/5/7 21:35
*/
public class ActivitiUtil {
private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//部署流程
@Test
public void deployProcessDefinition() throws FileNotFoundException {
//获取资源路径
String bpmn = "house_least.bpmn";
String png = "house_least.png";
Deployment deployment = processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service
.createDeployment()//创建部署对象
.addInputStream("bpmn", new FileInputStream("D:/" + bpmn))
.addInputStream(png, new FileInputStream("D:/" + png))
.deploy();//完成部署
System.out.println("部署ID:" + deployment.getId());//1
System.out.println("部署时间:" + deployment.getDeploymentTime());
}
//开启流程
@Test
public void startProcessInstance() {
Map<String, Object> map = new HashMap<>();
map.put("decideType", 2);
ProcessInstance pi = processEngine.getRuntimeService()//管理流程实例和执行对象,也就是表示正在执行的操作
.startProcessInstanceByKey("myProcess_1", map);按照流程定义的key启动流程实例
System.out.println("流程实例ID:" + pi.getId());//流程实例ID:101
System.out.println("流程实例ID:" + pi.getProcessInstanceId());//流程实例ID:101
System.out.println("流程实例ID:" + pi.getProcessDefinitionId());//myMyHelloWorld:1:4
}
//查找流程
@Test
public void findPersonnelTaskList() {
String assignee = "张三";//当前任务办理人
List<Task> tasks = processEngine.getTaskService()//与任务相关的Service
.createTaskQuery()//创建一个任务查询对象
/*.taskAssignee(assignee)*/
.list();
if (tasks != null && tasks.size() > 0) {
for (Task task : tasks) {
System.out.println("任务ID:" + task.getId());
System.out.println("任务的办理人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
System.out.println("任务的创建时间:" + task.getCreateTime());
System.out.println("任务ID:" + task.getId());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
System.out.println("#####################################");
}
}
}
//完成任务
@Test
public void completeTask() {
String taskID = "17506";
processEngine.getTaskService().complete(taskID);
System.out.println("完成任务:" + taskID);
}
// 查询流程定义
@Test
public void findProcessDifinitionList() {
List<ProcessDefinition> list = processEngine.getRepositoryService()
.createProcessDefinitionQuery()
// 查询条件
.processDefinitionKey("myProcess_1")// 按照流程定义的key
// .processDefinitionId("helloworld")//按照流程定义的ID
.orderByProcessDefinitionVersion().desc()// 排序
// 返回结果
// .singleResult()//返回惟一结果集
// .count()//返回结果集数量
// .listPage(firstResult, maxResults)
.list();// 多个结果集
if (list != null && list.size() > 0) {
for (ProcessDefinition pd : list) {
System.out.println("流程定义的ID:" + pd.getId());
System.out.println("流程定义的名称:" + pd.getName());
System.out.println("流程定义的Key:" + pd.getKey());
System.out.println("流程定义的部署ID:" + pd.getDeploymentId());
System.out.println("流程定义的资源名称:" + pd.getResourceName());
System.out.println("流程定义的版本:" + pd.getVersion());
System.out.println("########################################################");
}
}
}
//删除流程定义
@Test
public void deleteProcessDifinition() {
//部署对象ID
String deploymentId = "5001";
processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service
.deleteDeployment(deploymentId, true);
System.out.println("删除成功~~~");//使用部署ID删除流程定义,true表示级联删除
}
//查看流程定义的资源文件
@Test
public void viewPng() throws IOException {
//部署ID
String deploymentId = "1";
//获取的资源名称
List<String> list = processEngine.getRepositoryService()
.getDeploymentResourceNames(deploymentId);
//获得资源名称后缀.png
String resourceName = "";
if (list != null && list.size() > 0) {
for (String name : list) {
if (name.indexOf(".png") >= 0) {//返回包含该字符串的第一个字母的索引位置
resourceName = name;
}
}
}
//获取输入流,输入流中存放.PNG的文件
InputStream in = processEngine.getRepositoryService()
.getResourceAsStream(deploymentId, resourceName);
//将获取到的文件保存到本地
FileUtils.copyInputStreamToFile(in, new File("E:/" + resourceName));
System.out.println("文件保存成功!");
}
}