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();