流程常用操作类
package com.util;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricIdentityLink;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @Description: 用于常用的流程操作,引入对应流程操作的Service
* @Author: LeayLu
* @Date: 2018年11月16日 上午11:50:50
* @Version: 1.0
*/
public class FlowUtil {
private static final Logger logger = LoggerFactory.getLogger(FlowUtil.class);
/**
* 从classpath路径下,部署流程定义Zip形式读取
* @param filePath zip压缩包文件路径
* @param deploymentName 部署名称
*/
public void deploymentProcessDefinitionZip(String filePath,String deploymentName,RepositoryService repositoryService) {
InputStream in = this.getClass().getClassLoader().getResourceAsStream(filePath);
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = repositoryService
.createDeployment()
.name(deploymentName)
.addZipInputStream(zipInputStream)
.deploy();
logger.info("流程定义部署成功!");
logger.info("部署ID "+deployment.getId());
logger.info("部署名称 "+deployment.getName());
}
/**
* 从classpath读取资源,部署流程定义
* @param dpmnPath dpmn源文件
* @param pngPath png文件路径
* @param deploymentName 部署名称
*/
public void deploymentProcessDefinitionBpmnAndPng(String dpmnPath,String pngPath,String deploymentName,RepositoryService repositoryService) {
Deployment deployment = repositoryService
.createDeployment()
.name(deploymentName)
.addClasspathResource(dpmnPath)
.addClasspathResource(pngPath)
.deploy();
logger.info("流程定义部署成功!");
logger.info("部署ID "+deployment.getId());
logger.info("部署名称 "+deployment.getName());
}
/**
* 根据流程部署的key启动,按key启动是按照最新版本启动
* @param processDefinitionKey 流程定义Key
*/
public void startProcesssInstance(String processDefinitionKey,RuntimeService runtimeService) {
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey(processDefinitionKey);
logger.info("流程启动成功!");
logger.info("流程实例ID "+processInstance.getId());
logger.info("流程定义ID "+processInstance.getProcessDefinitionId());
}
/**
* 查询个人任务,默认按任务创建时间降序
* 如需其他排序,自定义
* @param assignee 办理人
* @return 返回当前办理人的所有任务
*/
public List<Task> findTask(String assignee,TaskService taskService) {
List<Task> list = taskService
.createTaskQuery()
.orderByTaskCreateTime().desc()
.taskAssignee(assignee)
.list();
logger.info("个人任务查询成功!");
logger.info("查询结果条数为 { "+list.size()+" }条");
return list;
}
/**
* 查询组任务任务,默认按任务创建时间降序
* 如需其他排序,自定义
* @param candidateUser 组任务的候选人
* @return 候选人的组任务
*/
public List<Task> findGroupTask(String candidateUser,TaskService taskService) {
List<Task> list = taskService
.createTaskQuery()
.taskCandidateUser(candidateUser)
.orderByTaskCreateTime().desc()
.list();
logger.info("组任务查询成功!");
logger.info("查询结果条数为 { "+list.size()+" }条");
return list;
}
/**
* 完成任务
* @param taskId 任务id
*/
public void completeTask(String taskId,TaskService taskService) {
taskService.complete(taskId);
logger.info("完成任务: 任务ID"+taskId);
}
/**
* 完成任务并传递流程变量
* @param taskId 任务id
* @param variables 流程变量
*/
public void completeTask(String taskId,Map<String, Object> variables,TaskService taskService) {
taskService.complete(taskId, variables);
logger.info("完成任务: 任务ID"+taskId);
}
/**
* 拾取任务
* @param taskId 任务Id
* @param userId 办理人Id
*/
public void setAssigees(String taskId,String userId,TaskService taskService) {
taskService.setAssignee(taskId, userId);
logger.info("任务拾取成功!");
logger.info("任务ID : "+taskId);
logger.info("办理人 : "+userId);
}
/**
* 拾取任务,将组任务分给个人任务,指定任务办理人字段
* @param taskId 任务Id
* @param userId 分配的个人任务(可以是组任务中的成员,也可以是非组任务的成员)
*/
public void claim(String taskId,String userId,TaskService taskService) {
taskService.claim(taskId, userId);
}
/**
* 向组任务中添加候选人
* @param taskId 任务Id
* @param userId 候选人Id
*/
public void addAssigee(String taskId,String userId,TaskService taskService) {
taskService.addCandidateUser(taskId, userId);
}
/**
* 删除组任务中的候选人
* @param taskId 任务Id
* @param userId 候选人Id
*/
public void deleteAssigee(String taskId,String userId,TaskService taskService) {
// 删除候选人
taskService.deleteCandidateUser(taskId, userId);
}
/**
* 查询正在执行的任务办理人表
* @param taskId 任务Id
* @return
*/
public List<IdentityLink> findRunPersonTask(String taskId,TaskService taskService) {
List<IdentityLink> list = taskService
.getIdentityLinksForTask(taskId);
logger.info("正在执行的任务办理人表,查询成功");
logger.info("查询结果数为:{"+list.size()+"}条");
return list;
}
/**
* 查询正在执行的任务办理人表
* @param processInstanceId 流程实例Id
* @return
*/
public List<HistoricIdentityLink> findHitoryPersonTask(String processInstanceId,HistoryService historyService) {
List<HistoricIdentityLink> list = historyService
.getHistoricIdentityLinksForProcessInstance(processInstanceId);
logger.info("正在执行的任务办理人表,查询成功");
logger.info("查询结果数为:{"+list.size()+"}条");
return list;
}
/**
* 删除流程定义,根据定义的key删除所有版本
* 级联删除
* 不管流程是否启动,都能可以删除
* @param processDefinitionKey 流程定义key
*/
public void deleteProcessDefinitionByKey(String processDefinitionKey,RepositoryService repositoryService) {
List<ProcessDefinition> list = repositoryService
.createProcessDefinitionQuery()
.processDefinitionKey(processDefinitionKey) //使用流程定义的key查询
.list();
// 遍历,获取每个流程定义的部署ID
if(list!=null&&list.size()>0) {
for(ProcessDefinition pd :list) {
// 获取部署ID
String deploymentId = pd.getDeploymentId();
repositoryService.deleteDeployment(deploymentId, true);
}
}
logger.info("流程的Key为: {"+processDefinitionKey+"}的所有版本删除成功");
}
/**
* 删除流程定义,使用部署Id
* @param deploymentId
*/
public void deleteProcessDefinition(String deploymentId,RepositoryService repositoryService) {
repositoryService
.deleteDeployment(deploymentId, true);
logger.info("删除成功: 部署Id为"+deploymentId);
}
}