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