startProcessInstanceByKey 启动流程
//variables为流程变量(map集合)
Map<String,Object> variables = new HashMap<String,Object>();
variables.put("请假人", "冯小刚");
//使用流程定义的key启动流程实例,默认会按照最新版本启动流程实例
ProcessInstance pi = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey , variables );
TaskQuery 查询任务
TaskQuery query = TaskService.createTaskQuery();
//还得为其设置一些查询条件
query.taskId(taskId)
query.taskAssignee(assignee);
query.orderByTaskCreateTime().desc();
ProcessDefinitionQuery 查询流程定义
ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
//设置查询条件
query.processDefinitionId(processDefinitionId);
query.processDefinitionName(processDefinitionName);
query.processDefinitionKey(key);
//升序排列结果
query.orderByProcessDefinitionVersion().asc();
//所有的结果
List<ProcessDefinition> list = query.list();
//返回结果集的数量
query.count()
//分页查询
query.listPage(firstResult,maxResults);
//唯一的结果集
query.singleResult();
查询流程状态,通过 processInstanceId
public void queryProcessState(int processInstanceId){
//由于一个流程实例ID只对应一个实例,使用singleResult执行查询返回一个唯一的结果,如果结果数量大于1,则抛出异常
ProcessInstance pi = processEngine.getRuntimeService().createProcessInstanceQuery().setProcessInstanceId(processInstanceId).singleResult();
if(null != p ){
System.out.println("当前流程在:" + pi.getActivityId());
}else{
System.out.println("流程已结束!")
}
}
查询最新版本的流程定义
// 思路说明:先升序查询所有的,由于相同的流程具有相同的名称(相同名称的流程称为第一版本,第二版本...),然后将这些流程根据key放到map集合中,由于map集合的key不可重复,因此后续版本会覆盖之前的版本,map中所有的value就是去重的流程定义了
public List<ProcessDefinition> findLastList() {
ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
query.orderByProcessDefinitionVersion().asc();
List<ProcessDefinition> list = query.list();
Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();
for (ProcessDefinition pd : list) {
map.put(pd.getKey(), pd);
}
return new ArrayList<ProcessDefinition>(map.values());
}
部署(上传)流程:方法一,使用addZipInputStream
public void deploy(MultipartFile resource) {
DeploymentBuilder builder = repositoryService.createDeployment();
InputStream in = null;
try {
in = resource.getInputStream();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
ZipInputStream zipInputStream = new ZipInputStream(in);
builder.addZipInputStream(zipInputStream);
builder.deploy();
}
部署(上传)流程:方法二,使用addClasspathResource
// addClasspathResource表示从类路径下加载资源文件,一次只能加载一个文件
public void deploy() throws Exception{
repositoryService.createDeployment().addClasspathResource("*.bpmn").addClassppathResource("*.png").deploy();
}
根据流程定义的key删除流程定义
// 如果该流程定义下没有正在运行的流程,则可以用普通删除。如果是有关联的信息,用级联删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使用。
public void deleteByKey(String key) {
ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
query.processDefinitionKey(key);//根据key过滤
List<ProcessDefinition> pdList = query.list();
for (ProcessDefinition pd : pdList) {
//根据流程定义获取部署id
String deploymentId = pd.getDeploymentId();
//普通删除 processEngine.getRepositoryService().deleteDeployment(deploymentId, true);
//级联删除 //processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);
}
}
根据流程定义的id获取图片对应的输入流
public InputStream findImgStream(String id) {
return repositoryService.getProcessDiagram(id);
}