1、流程定义查询
根据流程定义的key,查询流程定义信息
核心代码:
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取 Repositoryservice
RepositoryService repositoryService = processEngine.getRepositoryService();
// 获取ProcessDifinitionQuery对象
ProcessDefinitionQuery definitionQuery = repositoryService.createProcessDefinitionQuery();
// 查询当前所有的流程定义 ,返回流程定义信息的集合
// processDefinitionKey(流程定义Key)
// orderByProcessDefinitionVersion 进行排序
// desc 倒叙
// list 查询出所有的内容
List<ProcessDefinition> definitionList = definitionQuery.processDefinitionKey("myEvec")
.orderByProcessDefinitionVersion()
.desc()
.list();
// 输出信息
for (ProcessDefinition processDefinition : definitionList) {
System.out.println("流程定义ID:"+processDefinition.getId());
System.out.println("流程定义名称:"+processDefinition.getName());
System.out.println("流程定义Key:"+processDefinition.getKey());
System.out.println("流程定义版本:"+processDefinition.getVersion());
System.out.println("流程部署ID:"+processDefinition.getDeploymentId());
}
2、流程删除
使用deploymentid删除流程
核心代码:
// 获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 通过引擎来获取 RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 通过部署id来删除流程部署信息
String deploymentId = "12501";
// repositoryService.deleteDeployment(deploymentId);
repositoryService.deleteDeployment(deploymentId,true);
3、流程资源下载
如果其他用户想要查看流程的资源文件,可以从数据库中把资源文件下载到本地
下载 资源文件
方案1: 使用Activiti提供的api,来下载资源文件,保存到文件目录
方案2: 自己写代码从数据库中下载文件,使用jdbc对blob 类型,clob类型数据读取出来,保存到文件目录
解决Io操作:commons-io.jar
这里我们使用方案1,Activiti提供的api:RespositoryService
核心代码:
// 1、得到引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取api,RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3、获取查询对象 ProcessDefinitionQuery查询流程定义信息
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("myEvec")
.singleResult();
// 4、通过流程定义信息,获取部署ID
String deploymentId = processDefinition.getDeploymentId();
// 5、通过RepositoryService ,传递部署id参数,读取资源信息(png 和 bpmn)
// 5.1、获取png图片的流
// 从流程定义表中,获取png图片的目录和名字
String pngName = processDefinition.getDiagramResourceName();
// 通过 部署id和 文件名字来获取图片的资源
InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, pngName);
// 5.2、获取bpmn的流
String bpmnName = processDefinition.getResourceName();
InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, bpmnName);
// 6、构造OutputStream流
File pngFile = new File("d:/evecflow01.png");
File bpmnFile = new File("d:/evecflow01.bpmn");
FileOutputStream pngOutStream = new FileOutputStream(pngFile);
FileOutputStream bpmnOutStream = new FileOutputStream(bpmnFile);
// 7、输入流,输出流的转换
IOUtils.copy(pngInput,pngOutStream);
IOUtils.copy(bpmnInput,bpmnOutStream);
// 8、关闭流
pngOutStream.close();
bpmnOutStream.close();
pngInput.close();
bpmnInput.close();
4、流程历史信息查询
HistoryService
核心代码:
// 获取引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 获取HistoryService
HistoryService historyService = processEngine.getHistoryService();
// 获取 actinst表的查询对象
HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
// 查询 actinst表,条件:根据 InstanceId 查询
// instanceQuery.processInstanceId("2501");
// 查询 actinst表,条件:根据 DefinitionId 查询
instanceQuery.processDefinitionId("myEvec:1:4");
// 增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序
instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
// 查询所有内容
List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();
// 输出
for (HistoricActivityInstance hi : activityInstanceList) {
System.out.println(hi.getActivityId());
System.out.println(hi.getActivityName());
System.out.println(hi.getProcessDefinitionId());
System.out.println(hi.getProcessInstanceId());
System.out.println("<==========================>");
}
}
5、流程定义和流程实例
一个流程定义可以对应多个流程实例
如:公司 出差申请流程 流程定义
职员 小章可以申请出差 深圳出差3天 流程实例
小丽可以申请出差 北京出差6天 流程实例
6、业务标识:Businesskey
可以查询自己的业务信息
如:小章出差 目的地,出差时长。
使用RuntimeService
核心代码:
// 1、获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3、启动流程的过程中,添加businesskey
// 第一个参数:流程定义的key
// 第二个参数:businessKey,存出差申请单的id,就是1001
ProcessInstance instance = runtimeService.
startProcessInstanceByKey("myEvec", "1001");
// 4、输出
System.out.println("businessKey=="+instance.getBusinessKey());
7、挂起、激活流程实例
单个挂起:操作流程实例。某个流程实例挂起则此流程不在继续执行,如果想完成该实例,会报错
使用RuntimeService
核心代码:
// 1、获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3、通过RuntimeService获取流程实例对象
ProcessInstance instance = runtimeService.createProcessInstanceQuery()
.processInstanceId("27501")
.singleResult();
// 4、得到当前流程实例的暂停状态,true-已暂停 false -激活
boolean suspended = instance.isSuspended();
// 5、获取流程实例id
String instanceId = instance.getId();
// 6、判断是否已经暂停,如果已经暂停,就执行激活操作
if(suspended){
// 如果已经暂停,就执行激活
runtimeService.activateProcessInstanceById(instanceId);
System.out.println("流程实例id:"+instanceId+"已经激活");
}else {
// 7、如果是激活状态,就执行暂停操作
runtimeService.suspendProcessInstanceById(instanceId);
System.out.println("流程实例id:"+instanceId+"已经暂停");
}
全部挂起:操作流程定义。流程定义为挂起状态,则不允许添加新的流程实例,同时,该流程定义下的所有流程实例全部执行挂起操作
RepositoryService,使用流程定义的id来执行挂起或者激活操作
核心代码:
// 1、获取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2、获取Repositoryservice
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3、查询流程定义,获取流程定义的查询对象
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey("myEvec")
.singleResult();
// 4、获取当前流程定义的实例是否都是挂起状态
boolean suspended = processDefinition.isSuspended();
// 5、获取流程定义的id
String definitionId = processDefinition.getId();
// 6、如果是挂起状态,改为激活状态
if(suspended){
// 如果是挂起,可以执行激活的操作,参数1:流程定义id 参数2:是否激活,参数3:激活时间
repositoryService.activateProcessDefinitionById(definitionId,
true,
null);
System.out.println("流程定义id:"+definitionId+",已激活");
}else {
// 7、如果是激活状态,改为挂起状态,参数1:流程定义id 参数2:是否暂停 参数3 :暂停的时间
repositoryService.suspendProcessDefinitionById(definitionId,
true,
null);
System.out.println("流程定义id:"+definitionId+",已挂起");
}