1.安装activiti插件
自行百度
2.画流程图
创建一个activiti design来画流程图
3.导入jar包
<!-- activiti-engine -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.15.1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-model</artifactId>
<version>5.15.1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-bpmn-converter</artifactId>
<version>5.15.1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-process-validation</artifactId>
<version>5.15.1</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>5.15.1</version>
</dependency>
4.配置activiti.cfg.xml
<bean id="processEngineConfiguration"
class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="oracle.jdbc.OracleDriver"/>
<property name="jdbcUrl" value="jdbc:oracle:thin:127.0.0.1:1521:orcl"/>
<property name="jdbcUsername" value="scott"/>
<property name="jdbcPassword" value="tiger"/>
<property name="databaseSchemaUpdate" value="true"/>
</bean>
5.创建23张表
@Test
public void mainTest(){
ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();
}
6.activiti流的基本操作
部署流程,只需要把我们之前的流程图放进去即可,以请假条为例子,可以理解为现在前台有请假条这种东西了。
@Test
public void demo1(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
engine.getRepositoryService().createDeployment()
.addClasspathResource("leave.bpmn").addClasspathResource("leave.png").deploy();
}
/**
* 通过 inputstream完成部署
*/
@Test
public void testDeployFromInputStream(){
InputStream bpmnStream = this.getClass().getClassLoader().getResourceAsStream("qingjia.bpmn");
//得到流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRepositoryService()
.createDeployment()
.addInputStream("qingjia.bpmn", bpmnStream)
.deploy();
}
/**
* 通过zipinputstream完成部署
*/
@Test
public void testDeployFromZipinputStream(){
InputStream in = this.getClass().getClassLoader().getResourceAsStream("qingjia.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
processEngine.getRepositoryService()
.createDeployment()
.addZipInputStream(zipInputStream)
.deploy();
}
实例化请假条,可以理解为现在张三找前台拿了一张请假条了,三种不同部署方式
@Test
public void demo2(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
engine.getRuntimeService().startProcessInstanceById("myProcess:2:1004");
}
提交流程,可以理解为张三把请假条写好了提交给他的领导,
@Test
public void demo3(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
engine.getTaskService().complete("1104");
}
张三提交之后,流程就到了张三的组长任务表里面,上级可以看自己有哪些需要处理的任务
@Test
public void demo4(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
List<Task> list = engine.getTaskService().createTaskQuery().taskAssignee("组长").list();
System.out.println(list.size());
for (Task task : list) {
System.out.println(task.getName());
}
}
组长看完任务之后,处理完任务可以提交上去,这样流程就到boss任务列表中
@Test
public void demo5(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
engine.getTaskService().complete("702");
}
当组长把流程提交了之后,老板就可以在任务里面看到该流程。老板选择提交流程,流程结束
@Test
public void demo6(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
engine.getTaskService().complete("802");
}
每一个人写一张申请表都是实例化一张表。
7.分配个人任务——流程变量
//第一,在流程图的assignee设置为#{userid}
//第二,在实例化的时候设置流程变量
HashMap<String,Object> variables = new HashMap<String, Object>();
variables.put("userid", "很重要");
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//myProcess是流程图的名字
ProcessInstance instance = engine.getRuntimeService().startProcessInstanceByKey("myProcess", variables);
System.out.println(instance.getId()+","+instance.getActivityId()+","+instance.getBusinessKey()+","+instance.getParentId()+","+instance.getProcessInstanceId());
//所以,第一个人是‘很重要’ 也就是请假表的申请人,我们可以获得该task.getid()
List<Task> list = engine.getTaskService().createTaskQuery().taskAssignee("很重要").list();
for (Task task : list) {
System.out.println(task.getName());
System.out.println(task.getParentTaskId());
System.out.println(task.getExecutionId());
System.out.println(task.getId());
}
//根据当前任务id获得根据流程变量名获得值
System.out.println(engine.getTaskService().getVariable("2003", "123"));
//很重要提交请假表
HashMap<String,Object> map = new HashMap<String, Object>();
map.put("userid", "胡智阳");
map.put("123", "zzz");
//提交当前任务并且设置下一个任务人是胡智阳
engine.getTaskService().complete("1905", map);
8.组任务分配
1.把下面设置为#{userids}
2在实例化的时候设置流程变量
//现在很重要和有点重要都是下一个任务人
HashMap<String,Object> variables = new HashMap<String, Object>();
variables.put("userid", "很重要,有点重要");
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
//myProcess是流程图的名字
ProcessInstance instance = engine.getRuntimeService().startProcessInstanceByKey("myProcess", variables);
System.out.println(instance.getId()+","+instance.getActivityId()+","+instance.getBusinessKey()+","+instance.getParentId()+","+instance.getProcessInstanceId());
//所以,‘很重要’,‘有点重要’ 也就是请假表的申请人,我们可以获得该task.getid()
List<Task> list = engine.getTaskService().createTaskQuery().taskAssignee("很重要/有点重要").list();
for (Task task : list) {
System.out.println(task.getName());
System.out.println(task.getParentTaskId());
System.out.println(task.getExecutionId());
System.out.println(task.getId());
}
//根据当前任务id获得根据流程变量名获得值
System.out.println(engine.getTaskService().getVariable("2003", "123"));
//很重要和有点重要都要提交任务
//很重要提交请假表
HashMap<String,Object> map = new HashMap<String, Object>();
map.put("userid", "胡智阳");
map.put("123", "zzz");
//提交当前任务并且设置下一个任务人是胡智阳
engine.getTaskService().complete("1905", map);
9.核心API
流程引擎ProcessEngine
//使用方式
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
管理流程定义RepositoryService
//使用方式
engine.getRepositoryService()
执行管理,包括流程的启动,删除操作RuntimeService
//使用方式
engine.getRuntimeService()
任务管理TaskService
//使用方式
engine.getTaskService()