activiti6工作流开发(二)–流程控制
文章目录
流程查询
通过流程定义Key(流程图ID)
public ProcessDefinition queryDefinitionByKey(String key){
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(key)
.singleResult();
return processDefinition;
}
获取流程BPMN资源
public InputStream queryBpmnFile(ProcessDefinition processDefinition){
RepositoryService repositoryService = processEngine.getRepositoryService();
//BPMN文件
InputStream resourceAsStream = repositoryService
.getResourceAsStream(processDefinition.getDeploymentId(), processDefinition.getResourceName());
return resourceAsStream;
}
获取流程PNG图
public InputStream queryBpmnPNGFile(ProcessDefinition processDefinition){
RepositoryService repositoryService = processEngine.getRepositoryService();
//PNG图
InputStream processDiagram = repositoryService
.getProcessDiagram(processDefinition.getDeploymentId());
return processDiagram;
}
历史查找
public List queryHistoryInfo(String definitionId){
HistoryService historyService = processEngine.getHistoryService();
List<HistoricActivityInstance> list = historyService
.createHistoricActivityInstanceQuery()
.processDefinitionId(definitionId)
.orderByHistoricActivityInstanceEndTime()
.asc()
.list();
return list;
}
流程删除
根据流程部署Id来删除流程(act_re_deployment里面的ID)
public void deleteDeployment(String deleteDeployId){
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.deleteDeployment(deleteDeployId);
}
流程绑定Businesskey
一个流程定义部署可以启动多个流程实例,每个流程的执行互部影响,每个执行是单独的流程实例。在流程启动实例时,可以指定Businesskey。
Businesskey
:业务标识,通常为业务表的主键,业务标识和流程实例一一对应。业务标识来源于业务系统。存储业务标识就是根据业务标识来关联查询业务系统的数据。
Businesskey一般都会保存相关联的业务操作表的主键,再通过主键ID去查询业务信息,比如通过出差单的ID,去查询更多的请假信息(出差人,出差时间,出差天数,出差目的地等)
启动流程实例时绑定Businesskey
public ProcessInstance startProcessByKey(String processDefinitionKey,String businessKey){
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey(processDefinitionKey, businessKey);
return processInstance;
}
获取流程的Businesskey
public String getBusinessKey(ProcessInstance processInstance){
return processInstance.getBusinessKey();
}
流程实例挂起
流程实例有两种该区方式:
- 通过流程声明关闭某一流程声明下的所有流程实例(并停用该流程声明来启动实例)
- 通过流程实例ID锁定某一流程实例进行关闭
挂起流程声明部署
public void suspendProcessDefinition(ProcessDefinition processDefinition){
RepositoryService repositoryService = processEngine.getRepositoryService();
//参数:声明ID,是否挂起实例,挂起时间
repositoryService
.suspendProcessDefinitionById(processDefinition.getId(),true,null);
}
挂起流程实例
public void suspendProcessInstance(ProcessInstance processInstance){
RuntimeService runtimeService = processEngine.getRuntimeService();
runtimeService.suspendProcessInstanceById(processInstance.getId());
}
激活流程声明部署
public void activateProcessDefinition(ProcessDefinition processDefinition){
RepositoryService repositoryService = processEngine.getRepositoryService();
//参数:声明ID,是否激活实例,激活时间
repositoryService
.activateProcessDefinitionById(processDefinition.getId(),true,null);
}
激活流程实例
public void activateProcessInstance(ProcessInstance processInstance){
RuntimeService runtimeService = processEngine.getRuntimeService();
runtimeService.activateProcessInstanceById(processInstance.getId());
}
设置局部流程变量
局部流程变量
任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大, 称为 local 变量。
Local 变量由于在不同的任务或不同的执行实例中,作用域互不影响,变量名可以相同没有影响。Local 变量名也可以和 global 变量名相同,没有影响。
设置
public void setLocalVariable(Task task, Map variables){
TaskService taskService = processEngine.getTaskService();
taskService.setVariablesLocal(task.getId(),variables);
}
组任务
组任务跟普通的任务并没有什么太大的区别,区别在于组任务有多个任务候选人,候选人通过拾取操作,拾取任务执行权。
设置多个任务候选人
当一个任务拥有多个任务候选人的时候,这个任务就称为组任务。在流程图中任务节点的配置中设置 candidate-users(候选人),多个候选人之间用逗号分开。
任务拾取
public void claimTask(String taskId,String userId){
TaskService taskService = processEngine.getTaskService();
//查找,起验证作用
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskCandidateUser(userId)
.singleResult();
if(task != null){
taskService.claim(taskId,userId);
}
}
任务归还
当一个组任务没有负责人是,将重置为候选状态,需要候选人拾取,再次进入代办状态。
public void giveToGroupTask(String taskId,String assignee){
TaskService taskService = processEngine.getTaskService();
//查找,验证
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskAssignee(assignee)
.singleResult();
if (task != null){
//重置候选,代理人置空
taskService.setAssignee(taskId,null);
}
}
任务交接
public void giveToOtherCandidateUser(String taskId,String assignee,String otherAssignee){
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery()
.taskId(taskId)
.taskAssignee(assignee)
.singleResult();
if (task != null){
taskService.setAssignee(taskId,otherAssignee);
}
}