From fd4ff7d9d04c2cd69e06f98a9cb518808e51d68c Mon Sep 17 00:00:00 2001 From: konbai <1527468660@qq.com> Date: Fri, 6 May 2022 23:51:22 +0800 Subject: [PATCH] =?UTF-8?q?fix=20--=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 | 24 +++++++------------ .../service/impl/WfTaskServiceImpl.java | 7 +++++- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/ruoyi-flowable/pom.xml b/ruoyi-flowable/pom.xml index 4713c876..e9d464f6 100644 --- a/ruoyi-flowable/pom.xml +++ b/ruoyi-flowable/pom.xml @@ -27,11 +27,10 @@ flowable-spring-boot-starter-process - - 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 78f46479..3b202f0c 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,7 @@ 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 org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.*; import org.flowable.engine.RepositoryService; @@ -65,10 +64,7 @@ public class FindNextNodeUtil { //1.有表达式,且为true //2.无表达式 String expression = sequenceFlow.getConditionExpression(); - if (expression == null || - Boolean.parseBoolean( - String.valueOf( - result(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))))) { + if (expression == null || expressionResult(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))) { //出线的下一节点 String nextFlowElementID = sequenceFlow.getTargetRef(); if (checkSubProcess(nextFlowElementID, flowElements, nextUser)) { @@ -211,19 +207,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-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java index 0b4da10e..7463754b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/workflow/service/impl/WfTaskServiceImpl.java @@ -470,11 +470,13 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ Authentication.setAuthenticatedUserId(LoginHelper.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(); } @@ -777,10 +779,13 @@ public class WfTaskServiceImpl extends FlowServiceFactory implements IWfTaskServ */ @Override public WfNextDto getNextFlowNode(WfTaskBo bo) { + // Step 1. 获取当前节点并找到下一步节点 Task task = taskService.createTaskQuery().taskId(bo.getTaskId()).singleResult(); WfNextDto nextDto = new WfNextDto(); 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();