From 335a8b59101c52cbfa5f51e6a8873bab74cd9436 Mon Sep 17 00:00:00 2001
From: tony <846249920@qq.com>
Date: Fri, 22 Apr 2022 17:49:35 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9B=B4=E6=8D=A2=E8=A1=A8=E8=BE=BE?=
=?UTF-8?q?=E5=BC=8F=E8=A7=A3=E6=9E=90=E5=BC=95=E6=93=8E=E4=B8=BAaviator?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-flowable/pom.xml | 7 +++--
.../ruoyi/flowable/flow/FindNextNodeUtil.java | 26 ++++++++-----------
.../service/impl/FlowTaskServiceImpl.java | 21 ++++++++++-----
3 files changed, 28 insertions(+), 26 deletions(-)
diff --git a/ruoyi-flowable/pom.xml b/ruoyi-flowable/pom.xml
index 76276a7..a3c7962 100644
--- a/ruoyi-flowable/pom.xml
+++ b/ruoyi-flowable/pom.xml
@@ -85,11 +85,10 @@
spring-boot-starter-websocket
-
- org.eweb4j
- fel
- 0.8
+ com.googlecode.aviator
+ aviator
+ 5.3.1
diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FindNextNodeUtil.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FindNextNodeUtil.java
index 9dfe658..bc31c4a 100644
--- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FindNextNodeUtil.java
+++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/flow/FindNextNodeUtil.java
@@ -1,8 +1,10 @@
package com.ruoyi.flowable.flow;
-import com.greenpineyu.fel.FelEngine;
-import com.greenpineyu.fel.FelEngineImpl;
-import com.greenpineyu.fel.context.FelContext;
+import com.googlecode.aviator.AviatorEvaluator;
+import com.googlecode.aviator.Expression;
+//import com.greenpineyu.fel.FelEngine;
+//import com.greenpineyu.fel.FelEngineImpl;
+//import com.greenpineyu.fel.context.FelContext;
import org.flowable.bpmn.model.Process;
import org.flowable.bpmn.model.*;
import org.flowable.engine.RepositoryService;
@@ -67,9 +69,7 @@ public class FindNextNodeUtil {
//2.无表达式
String expression = sequenceFlow.getConditionExpression();
if (expression == null ||
- Boolean.parseBoolean(
- String.valueOf(
- result(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))))) {
+ expressionResult(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))) {
//出线的下一节点
String nextFlowElementID = sequenceFlow.getTargetRef();
if (checkSubProcess(nextFlowElementID, flowElements, nextUser)) {
@@ -212,19 +212,15 @@ public class FindNextNodeUtil {
}
/**
- * 校验el表达示例
+ * 校验el表达式
*
* @param map
* @param expression
* @return
*/
- public static Object result(Map map, String expression) {
- FelEngine fel = new FelEngineImpl();
- FelContext ctx = fel.getContext();
- for (Map.Entry entry : map.entrySet()) {
- ctx.set(entry.getKey(), entry.getValue());
- }
- Object result = fel.eval(expression);
- return result;
+ public static boolean expressionResult(Map map, String expression) {
+ Expression exp = AviatorEvaluator.compile(expression);
+ final Object execute = exp.execute(map);
+ return Boolean.parseBoolean(String.valueOf(execute));
}
}
diff --git a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java
index 8e2b349..9738125 100644
--- a/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java
+++ b/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowTaskServiceImpl.java
@@ -469,25 +469,29 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
if (CollectionUtils.isEmpty(task)) {
throw new CustomException("流程未启动或已执行完成,取消申请失败");
}
-
- SysUser loginUser = SecurityUtils.getLoginUser().getUser();
+ // 获取当前需撤回的流程实例
ProcessInstance processInstance =
- runtimeService.createProcessInstanceQuery().processInstanceId(flowTaskVo.getInstanceId()).singleResult();
+ runtimeService.createProcessInstanceQuery()
+ .processInstanceId(flowTaskVo.getInstanceId())
+ .singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
if (Objects.nonNull(bpmnModel)) {
Process process = bpmnModel.getMainProcess();
List endNodes = process.findFlowElementsOfType(EndEvent.class, false);
if (CollectionUtils.isNotEmpty(endNodes)) {
+ SysUser loginUser = SecurityUtils.getLoginUser().getUser();
Authentication.setAuthenticatedUserId(loginUser.getUserId().toString());
// taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.STOP.getType(),
// StringUtils.isBlank(flowTaskVo.getComment()) ? "取消申请" : flowTaskVo.getComment());
+ // 获取当前流程最后一个节点
String endId = endNodes.get(0).getId();
List executions =
runtimeService.createExecutionQuery().parentId(processInstance.getProcessInstanceId()).list();
List executionIds = new ArrayList<>();
executions.forEach(execution -> executionIds.add(execution.getId()));
- runtimeService.createChangeActivityStateBuilder().moveExecutionsToSingleActivityId(executionIds,
- endId).changeState();
+ // 变更流程为已结束状态
+ runtimeService.createChangeActivityStateBuilder()
+ .moveExecutionsToSingleActivityId(executionIds, endId).changeState();
}
}
@@ -862,10 +866,13 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
*/
@Override
public AjaxResult getNextFlowNode(FlowTaskVo flowTaskVo) {
+ // Step 1. 获取当前节点并找到下一步节点
Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult();
FlowNextDto flowNextDto = new FlowNextDto();
if (Objects.nonNull(task)) {
- List nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, new HashMap<>());
+ // Step 2. 获取当前流程所有流程变量(网关节点时需要校验表达式)
+ Map variables = taskService.getVariables(task.getId());
+ List nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, variables);
if (CollectionUtils.isNotEmpty(nextUserTask)) {
for (UserTask userTask : nextUserTask) {
MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics();
@@ -908,7 +915,7 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
flowNextDto.setType(ProcessConstants.USER_TYPE_ROUPS);
flowNextDto.setRoleList(sysRoles);
}
- }else{
+ } else {
flowNextDto.setType(ProcessConstants.FIXED);
}
}