一、流程实例的管理接口常见功能:
1.启动一个流程(即创建一个流程实例)
2.本人发起的流程实例
3.本人参与的流程实例
4.挂起/激活流程实例
5.提前终止流程实例(或又叫撤销流程)
6.彻底删除流程实例
7.流程图查看
8.判断流程实例的状态(运行中/已结束)
import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.common.engine.impl.identity.Authentication;
import org.flowable.engine.*;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.repository.Deployment;
import org.flowable.engine.runtime.Execution;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.image.ProcessDiagramGenerator;
import org.flowable.task.api.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ActivitiUtils {
private static final Logger logger = LoggerFactory.getLogger(ActivitiUtils.class);
private ProcessEngine processEngine;
private RuntimeService runtimeService;
private TaskService taskService;
private RepositoryService repositoryService;
@Autowired
public ActivitiUtils(ProcessEngine processEngine, RepositoryService repositoryService,RuntimeService runtimeService, TaskService taskService) {
this.processEngine = processEngine;
this.repositoryService = repositoryService;
this.runtimeService = runtimeService;
this.taskService = taskService;
}
/**
* 启动流程
*
* @param processKey 流程定义key
* @param params
* @return
*/
public ProcessInstance startFlow(String processKey, Map params) {
//启动前必须开启,这样才能取得流程发起人
String userId = params.get("AuthenticatedUserId").toString();
//设置流程实例的发起人是当前用户
Authentication.setAuthenticatedUserId(userId);
// 取得业务id
String businessKey = params.get("businessKey").toString();
if (StringUtils.isEmpty(processKey)) {
logger.error("错误:流程定义未找到!");
}
if (null == params) {
params = new HashMap<>();
}
Deployment deployment = repositoryService.createDeploymentQuery().processDefinitionKey(processKey).singleResult();
if (deployment == null) {
logger.error("错误:启动流程实例:" + processKey);
}
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processKey, businessKey, params);// 同时设置业务的id到流程实例中的BUSINESS_KEY_
logger.info("成功:启动流程实例:" + processInstance.getProcessDefinitionName() + ":" + processInstance.getId());
Authentication.setAuthenticatedUserId(null); // 这个方法最终使用一个ThreadLocal类型的变量进行存储,也就是与当前的线程绑定,所以流程实例启动完毕之后,需要设置为null,防止多线程的时候出问题。
return processInstance;
}
/**
* 终止流程实例
*
* @param processInstanceId
*/
public void deleteProcessInstanceById(String processInstanceId) {
// ""这个参数本来可以写删除原因
runtimeService.deleteProcessInstance(processInstanceId,"");
}
/**
* 我发起的流程实例列表
*
* @param userId
* @return 流程实例列表
*/
public List getMyStartProcint(String userId) {
List list = processEngine.getHistoryService()
.createHistoricProcessInstanceQuery()
.startedBy(userId)
.orderByProcessInstanceStartTime()
.asc()
.list();
return list;
}
/**
* 挂起流程实例
*
* @param processInstanceId 当前流程实例id
*/
public void handUpProcessInstance(String processInstanceId) {
runtimeService.suspendProcessInstanceById(processInstanceId);
}
/**
* 恢复(唤醒)被挂起的流程实例
*
* @param processInstanceId 流程实例id
*/
public void activateProcessInstance(String processInstanceId) {
runtimeService.activateProcessInstanceById(processInstanceId);
}
/**
* 判断流程实例在运行中存不存在
*
* @param processInstanceId 流程实例
* @return true表示存在,false表示不存在
*/
public Boolean isExistProcIntRunning(String processInstanceId){
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();
if (processInstance == null) {
return false;
} else {
return true;
}
}
/**
* 查询历史实例中流程实例是否存在
*
* @param processInstanceId 流程实例
* @return true表示存在,false表示不存在
*/
public Boolean isExistProcHistory(String processInstanceId){
HistoricProcessInstance historicProcessInstance = processEngine.getHistoryService()
.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId)
.singleResult();
if (historicProcessInstance == null) {
return false;
} else {
return true;
}
}
/**
* 生成流程图
* 通过传入流程启动id去查询当前流执行节点
* 返回流程图 到期节点 标红显示
*
* @param response
* @param processId 任务ID
* @throws Exception
*/
public void genProcessDiagram(HttpServletResponse response, String processId) throws Exception {
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();
//流程走完的不显示图
if (processInstance == null) {
return;
}
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
//使用流程实例ID,查询正在执行的执行对象表,返回流程实例对象
String processInstanceId = task.getProcessInstanceId();
List executions = runtimeService.createExecutionQuery().processInstanceId(processInstanceId).list();
//得到正在执行的Activity的Id
List activityIds = new ArrayList<>();
List flows = new ArrayList<>();
for (Execution exe : executions) {
List activeActivityIds = runtimeService.getActiveActivityIds(exe.getId());
activityIds.addAll(activeActivityIds);
}
//获取流程图
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
ProcessEngineConfiguration processEngineConfiguration = processEngine.getProcessEngineConfiguration();
ProcessDiagramGenerator processDiagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();
InputStream in = processDiagramGenerator.generateDiagram(bpmnModel, "png", activityIds, flows, processEngineConfiguration.getActivityFontName(), processEngineConfiguration.getLabelFontName(), processEngineConfiguration.getAnnotationFontName(), processEngineConfiguration.getClassLoader(), 1.0, false);
OutputStream out = null;
byte[] buf = new byte[1024];
int legth = 0;
try {
out = response.getOutputStream();
while ((legth = in.read(buf)) != -1) {
out.write(buf, 0, legth);
}
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}