Activiti教程(八)activiti的流程节点任务
一.工作流引起整体流程示意图
流程设计--->部署流程定义--->启动流程--->任务签收--->流程结束
流程设计:生成bpmn文件和png图
部署流程定义:生成部署信息 生成流程定义信息 查询部署信息资源文件 查询流程定义信息 删除部署信息 查询流程动作图
启动流程:查询个人流程信息 查询组流程信息 查询部署信息资源文件 查询流程定义信息
任务签收:查询待办任务信息 查询流程信息 查询流程动作图
二.部署流程定义想关
package com.lpinfo.activiti.test;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.apache.commons.io.FileUtils;
import org.junit.Test;
public class DeploymentTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**
* 部署方式二 基于 helloworld.zip 把bpmn文件和png文件打成zip包部署
* getRepositoryService().createDeployment()//创建一个部署对象
* getRepositoryService().name("helloworld入门程序")//添加部署的名称
* getRepositoryService().addZipInputStream(zipInputStream)//指定zip格式的文件完成部署
* getRepositoryService().deploy();
*/
@Test
public void deploymentProcessDefinition_zip(){
InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
.createDeployment()//创建一个部署对象
.name("helloworld入门程序")//添加部署的名称
.addZipInputStream(zipInputStream)//指定zip格式的文件完成部署
.deploy();
System.out.println("流程部署ID:"+deployment.getId());
System.out.println("流程部署名称 :"+deployment.getName());
}
/**
* ==查询部署的流程
* getRepositoryService()//与流程定义和部署对象相关的Service
* createProcessDefinitionQuery()//创建一个流程定义的查询
* createProcessDefinitionQuery().deploymentId(deploymentId)//使用部署对象ID查询
* createProcessDefinitionQuery().processDefinitionId(processDefinitionId)//使用流程定义ID查询
* createProcessDefinitionQuery().processDefinitionNameLike(processDefinitionNameLike)//使用流程定义的名称模糊查询
* createProcessDefinitionQuery().orderByProcessDefinitionVersion().asc()//按照版本的升序排列
* createProcessDefinitionQuery().orderByProcessDefinitionName().desc()//按照流程定义的名称降序排列
* createProcessDefinitionQuery().list();//返回一个集合列表,封装流程定义
* createProcessDefinitionQuery().singleResult();//返回惟一结果集
* createProcessDefinitionQuery().count();//返回结果集数量
* createProcessDefinitionQuery().listPage(firstResult, maxResults);//分页查询
*/
@Test
public void findProcessDefinition(){
List<ProcessDefinition> list = processEngine.getRepositoryService()
.createProcessDefinitionQuery()
.list();
if(list!=null && list.size()>0){
for(ProcessDefinition pd:list){
System.out.println("流程定义ID:"+pd.getId());//流程定义的key+版本+随机生成数
System.out.println("流程定义的名称:"+pd.getName());//对应helloworld.bpmn文件中的name属性值
System.out.println("流程定义的key:"+pd.getKey());//对应helloworld.bpmn文件中的id属性值
System.out.println("流程定义的版本:"+pd.getVersion());//当流程定义的key值相同的相同下,版本升级,默认1
System.out.println("资源名称bpmn文件:"+pd.getResourceName());
System.out.println("资源名称png文件:"+pd.getDiagramResourceName());
System.out.println("部署对象ID:"+pd.getDeploymentId());
System.out.println("#########################################################");
}
}
}
/**
* 删除流程定义
* .deleteDeployment(deploymentId); //非级联删除 只能删除未启动的 会有垃圾数据
* .deleteDeployment(deploymentId, true); //级联删除 不管流程是否启动,都能可以删除
* */
@Test
public void deleteProcessDefinition(){
//使用部署ID,完成删除
String deploymentId = "601";
//删除未启动的
//processEngine.getRepositoryService().deleteDeployment(deploymentId);
//都可以删除
processEngine.getRepositoryService().deleteDeployment(deploymentId, true);
}
/**
* 查看流程图
*/
@Test
public void viewPic() throws IOException{
String deploymentId = "801";
//获取图片资源名称
List<String> list = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);
//定义图片资源的名称
String resourceName = "";
if(list!=null && list.size()>0){
for(String name:list){
if(name.indexOf(".png")>=0){
resourceName = name;
}
}
}
//获取图片的输入流
InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);
//将图片生成到D盘的目录下
File file = new File("D:/"+resourceName);
//将输入流的图片写到D盘下
FileUtils.copyInputStreamToFile(in, file);
}
}
三.流程启动和流程实例相关
package com.lpinfo.activiti.test;
import java.util.List;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
public class ProcessInstanceTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**
* 省略流程部署 参考DeploymentTest.java
*/
/**
* 启动流程实例
* startProcessInstanceByKey(processDefinitionKey)
* //使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
*
* */
@Test
public void startProcessInstance(){
//流程定义的key
String processDefinitionKey = "helloworld";
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey);
System.out.println("流程实例ID:"+pi.getId());
System.out.println("流程定义ID:"+pi.getProcessDefinitionId());
}
/**
* 查询当前人的个人任务
* */
@Test
public void findMyPersonalTask(){
String assignee = "王五";
List<Task> list = processEngine.getTaskService()
.createTaskQuery()
/**查询条件(where部分)*/
.taskAssignee(assignee)//指定个人任务查询,指定办理人
// .taskCandidateUser(candidateUser)//组任务的办理人查询
// .processDefinitionId(processDefinitionId)//使用流程定义ID查询
// .processInstanceId(processInstanceId)//使用流程实例ID查询
// .executionId(executionId)//使用执行对象ID查询
/**排序*/
.orderByTaskCreateTime().asc()//使用创建时间的升序排列
/**返回结果集*/
// .singleResult()//返回惟一结果集
// .count()//返回结果集的数量
// .listPage(firstResult, maxResults);//分页查询
.list();//返回列表
if(list!=null && list.size()>0){
for(Task task:list){
System.out.println("任务ID:"+task.getId());
System.out.println("任务名称:"+task.getName());
System.out.println("任务的创建时间:"+task.getCreateTime());
System.out.println("任务的办理人:"+task.getAssignee());
System.out.println("流程实例ID:"+task.getProcessInstanceId());
System.out.println("执行对象ID:"+task.getExecutionId());
System.out.println("流程定义ID:"+task.getProcessDefinitionId());
System.out.println("########################################################");
}
}
}
/**完成我的任务*/
@Test
public void completeMyPersonalTask(){
//任务ID
String taskId = "1202";
processEngine.getTaskService()//与正在执行的任务管理相关的Service
.complete(taskId);
System.out.println("完成任务:任务ID:"+taskId);
}
/**查询流程状态(判断流程正在执行,还是结束)*/
@Test
public void isProcessEnd(){
String processInstanceId = "1001";
ProcessInstance pi = processEngine.getRuntimeService()//表示正在执行的流程实例和执行对象
.createProcessInstanceQuery()//创建流程实例查询
.processInstanceId(processInstanceId)//使用流程实例ID查询
.singleResult();
if(pi==null){
System.out.println("流程已经结束");
}
else{
System.out.println("流程没有结束");
}
}
/**查询历史任务(后面讲)*/
@Test
public void findHistoryTask(){
String taskAssignee = "张三";
List<HistoricTaskInstance> list = processEngine.getHistoryService()//与历史数据(历史表)相关的Service
.createHistoricTaskInstanceQuery()//创建历史任务实例查询
.taskAssignee(taskAssignee)//指定历史任务的办理人
.list();
if(list!=null && list.size()>0){
for(HistoricTaskInstance hti:list){
System.out.println(hti.getId()+" "+hti.getName()+" "+hti.getProcessInstanceId()+" "+hti.getStartTime()+" "+hti.getEndTime()+" "+hti.getDurationInMillis());
System.out.println("################################");
}
}
}
/**查询历史流程实例(后面讲)*/
@Test
public void findHistoryProcessInstance(){
String processInstanceId = "1001";
HistoricProcessInstance hpi = processEngine.getHistoryService()//与历史数据(历史表)相关的Service
.createHistoricProcessInstanceQuery()//创建历史流程实例查询
.processInstanceId(processInstanceId)//使用流程实例ID查询
.singleResult();
System.out.println(hpi.getId()+" "+hpi.getProcessDefinitionId()+" "+hpi.getStartTime()+" "+hpi.getEndTime()+" "+hpi.getDurationInMillis());
}
}