工作流引擎Activiti中獲取下一分支節點
/**
* 根據例項編號查詢下一個任務節點
* @param String procInstId :例項編號
* @return
*/
public TaskDefinition nextTaskDefinition(String procInstId){
//流程標示
String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInstId).singleResult().getProcessDefinitionId();
ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl)repositoryService).getDeployedProcessDefinition(processDefinitionId);
//執行例項
ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(procInstId).singleResult();
//當前例項的執行到哪個節點
String activitiId = execution.getActivityId();
//獲得當前任務的所有節點
List<ActivityImpl> activitiList = def.getActivities();
String id = null;
for(ActivityImpl activityImpl:activitiList){
id = activityImpl.getId();
if(activitiId.equals(id)){
System.out.println("當前任務:"+activityImpl.getProperty("name"));
return nextTaskDefinition(activityImpl, activityImpl.getId(),"${iscorrect==1}");
// System.out.println(taskDefinition.getCandidateGroupIdExpressions().toArray()[0]);
// return taskDefinition;
}
}
return null;
}
/**
* 下一個任務節點
* @param activityImpl
* @param activityId
* @param elString
* @return
*/
private TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString){
if("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())){
TaskDefinition taskDefinition = ((UserTaskActivityBehavior)activityImpl.getActivityBehavior()).getTaskDefinition();
// taskDefinition.getCandidateGroupIdExpressions().toArray();
return taskDefinition;
}else{
List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions();
List<PvmTransition> outTransitionsTemp = null;
for(PvmTransition tr:outTransitions){
PvmActivity ac = tr.getDestination(); //獲取線路的終點節點
if("exclusiveGateway".equals(ac.getProperty("type"))){
outTransitionsTemp = ac.getOutgoingTransitions();
if(outTransitionsTemp.size() == 1){
return nextTaskDefinition((ActivityImpl)outTransitionsTemp.get(0).getDestination(), activityId, elString);
}else if(outTransitionsTemp.size() > 1){
for(PvmTransition tr1 : outTransitionsTemp){
Object s = tr1.getProperty("conditionText");
if(elString.equals(StrUtils.trim(s.toString()))){
return nextTaskDefinition((ActivityImpl)tr1.getDestination(), activityId, elString);
}
}
}
}else if("userTask".equals(ac.getProperty("type"))){
return ((UserTaskActivityBehavior)((ActivityImpl)ac).getActivityBehavior()).getTaskDefinition();
}else{
logger.debug(ac.getProperty("type"));
}
}
return null;
}
}
思路是通過例項ID獲取當前節點,然後查詢當前節點後後面所有的活動,主要查詢的活動是exclusiveGateway和userTask,如果exclusiveGateway中的條件符合${iscorrect==1}就直接查詢exclusiveGateway後的活動,直到找到userTask為止。如果當前節點後的活動是userTask,說明這個userTask就是你想要的。
程式碼中${iscorrect==1}表示式是流程中定義,表示稽核通過。當時對於在java中解析表示式遇到困難,所以使用字串來比較,程式碼如下:
if(elString.equals(StrUtils.trim(s.toString())))
就是用於判斷表示式。後來發現可以通說juel來解析,以下是解析的程式碼:
ExpressionFactory factory = new ExpressionFactoryImpl();
SimpleContext context = new SimpleContext();
context.setVariable("count", factory.createValueExpression(10000, String.class));
ValueExpression e = factory.createValueExpression(context, "${count>=1000}", boolean.class);
System.out.println(e.getValue(context));
在這裡插入程式碼片/**
* 查詢流程當前節點的下一步節點。用於流程提示時的提示。
*
* @param taskId
* @return
* @throws Exception
*/
public Map<String, FlowNode> findNextTask(String taskId) throws Exception {
Map<String, org.activiti.bpmn.model.FlowNode> nodeMap = new HashMap<String, org.activiti.bpmn.model.FlowNode>();
ProcessInstance processInstance = findProcessInstanceByTaskId(taskId);
// 查詢當前節點
HistoricTaskInstance histask = findHistricTaskById(taskId, processInstance.getProcessInstanceId());
// 查詢流程定義 。
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
List<org.activiti.bpmn.model.Process> listp = bpmnModel.getProcesses();
org.activiti.bpmn.model.Process process = listp.get(0);
// 當前節點流定義
FlowNode sourceFlowElement = (FlowNode) process.getFlowElement(histask.getTaskDefinitionKey());
// 找到當前任務的流程變數
List<HistoricVariableInstance> listVar = historyService.createHistoricVariableInstanceQuery()
.processInstanceId(processInstance.getId()).list();
iteratorNextNodes(process, sourceFlowElement, nodeMap, listVar);
return nodeMap;
}
/**
* 查詢流程當前節點的下一步節點。用於流程提示時的提示。
*
* @param process
* @param sourceFlowElement
* @param nodeMap
* @param listVar
* @throws Exception
*/
private void iteratorNextNodes(org.activiti.bpmn.model.Process process, FlowNode sourceFlowElement,
Map<String, FlowNode> nodeMap, List<HistoricVariableInstance> listVar) throws Exception {
List<SequenceFlow> list = sourceFlowElement.getOutgoingFlows();
for (SequenceFlow sf : list) {
sourceFlowElement = (FlowNode) process.getFlowElement(sf.getTargetRef());
if (StringUtils.isNotEmpty(sf.getConditionExpression())) {
ExpressionFactory factory = new ExpressionFactoryImpl();
SimpleContext context = new SimpleContext();
for (HistoricVariableInstance var : listVar) {
context.setVariable(var.getVariableName(),
factory.createValueExpression(var.getValue(), var.getValue().getClass()));
}
ValueExpression e = factory.createValueExpression(context, sf.getConditionExpression(), boolean.class);
if ((Boolean) e.getValue(context)) {
nodeMap.put(sourceFlowElement.getId(), sourceFlowElement);
break;
}
}
if (sourceFlowElement instanceof org.activiti.bpmn.model.UserTask) {
nodeMap.put(sourceFlowElement.getId(), sourceFlowElement);
break;
} else if (sourceFlowElement instanceof org.activiti.bpmn.model.ExclusiveGateway) {
iteratorNextNodes(process, sourceFlowElement, nodeMap, listVar);
}
}
}
相關文章
- JavaScript 獲取下一個元素節點JavaScript
- JavaScript獲取下一個同級元素節點JavaScript
- activiti工作流引擎元件元件
- 工作流引擎:jbpm和activiti
- Spring Boot 整合 Activiti 工作流引擎 極簡教程Spring Boot
- java Activiti 工作流引擎 SSM 框架模組設計方案JavaSSM框架
- JavaScript獲取下一個元素JavaScript
- 十分鐘認識Activiti6.0工作流引擎
- Activiti5.2 自動完成第一節點流程
- Activiti工作流學習筆記(四)——工作流引擎中責任鏈模式的建立與應用原理筆記模式
- 專案實踐之工作流引擎基本文件!Activiti工作流框架中流程引擎API和服務詳解框架API
- PHP中如何獲取下拉選單的值PHP
- 工作流引擎Activiti使用進階!詳細解析工作流框架中高階功能的使用示例框架
- jquery獲取指定節點的第一級文字節點jQuery
- 工作流引擎詳解!工作流開源框架ACtiviti的詳細配置以及安裝和使用框架
- Activiti工作流-簡介篇
- Activiti工作流-筆記2筆記
- Java Activiti 工作流引擎 springmvc SSM 流程審批 後臺框架原始碼JavaSpringMVCSSM框架原始碼
- Activiti工作流-實戰篇(用Activiti框架快速開發我們的工作流)框架
- activiti通過擴充套件點重寫節點行為套件
- Activiti - 新一代的開源 BPM 引擎
- jquery獲取下拉框選中的屬性值jQuery
- Linux 中 根據SRA號獲取下載連結Linux
- 【Activiti工作流】9.連線
- Git分支工作流程Git
- Activiti 流程啟動及節點流轉原始碼分析原始碼
- Activiti6.0 spring5 工作流引擎 java SSM流程審批 專案框架SpringJavaSSM框架
- 工作流引擎Activiti與SpringBoot2整合--開源軟體誕生17Spring Boot
- java Activiti6.0 後臺 框架 spring5 SSM 工作流引擎 審批流程Java框架SpringSSM
- Activiti6.0 java專案框架 spring5 SSM 工作流引擎 審批流程Java框架SpringSSM
- Git工作流指南:功能分支工作流Git
- Activiti Exploer工作流控制檯使用指南!使用Activiti Explorer定義部署執行工作流
- 初識工作流 BPMN Activiti以及JBPM
- 五分鐘瞭解Activiti工作流
- Activiti配置工作流結束過程
- springboot 整合 activiti 流程引擎Spring Boot
- 工作流中的流程追溯!詳細解析Activiti框架中的歷史元件框架元件
- 原生javascript獲取下一級子元素程式碼例項JavaScript