流程常用操作類
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);
}
}