fix: 更换表达式解析引擎为aviator

approve-sys
tony 2 years ago
parent 772cff258a
commit 335a8b5910

@ -85,11 +85,10 @@
<artifactId>spring-boot-starter-websocket</artifactId> <artifactId>spring-boot-starter-websocket</artifactId>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.eweb4j/fel -->
<dependency> <dependency>
<groupId>org.eweb4j</groupId> <groupId>com.googlecode.aviator</groupId>
<artifactId>fel</artifactId> <artifactId>aviator</artifactId>
<version>0.8</version> <version>5.3.1</version>
</dependency> </dependency>
</dependencies> </dependencies>

@ -1,8 +1,10 @@
package com.ruoyi.flowable.flow; package com.ruoyi.flowable.flow;
import com.greenpineyu.fel.FelEngine; import com.googlecode.aviator.AviatorEvaluator;
import com.greenpineyu.fel.FelEngineImpl; import com.googlecode.aviator.Expression;
import com.greenpineyu.fel.context.FelContext; //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.Process;
import org.flowable.bpmn.model.*; import org.flowable.bpmn.model.*;
import org.flowable.engine.RepositoryService; import org.flowable.engine.RepositoryService;
@ -67,9 +69,7 @@ public class FindNextNodeUtil {
//2.无表达式 //2.无表达式
String expression = sequenceFlow.getConditionExpression(); String expression = sequenceFlow.getConditionExpression();
if (expression == null || if (expression == null ||
Boolean.parseBoolean( expressionResult(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))) {
String.valueOf(
result(map, expression.substring(expression.lastIndexOf("{") + 1, expression.lastIndexOf("}")))))) {
//出线的下一节点 //出线的下一节点
String nextFlowElementID = sequenceFlow.getTargetRef(); String nextFlowElementID = sequenceFlow.getTargetRef();
if (checkSubProcess(nextFlowElementID, flowElements, nextUser)) { if (checkSubProcess(nextFlowElementID, flowElements, nextUser)) {
@ -212,19 +212,15 @@ public class FindNextNodeUtil {
} }
/** /**
* el * el
* *
* @param map * @param map
* @param expression * @param expression
* @return * @return
*/ */
public static Object result(Map<String, Object> map, String expression) { public static boolean expressionResult(Map<String, Object> map, String expression) {
FelEngine fel = new FelEngineImpl(); Expression exp = AviatorEvaluator.compile(expression);
FelContext ctx = fel.getContext(); final Object execute = exp.execute(map);
for (Map.Entry<String, Object> entry : map.entrySet()) { return Boolean.parseBoolean(String.valueOf(execute));
ctx.set(entry.getKey(), entry.getValue());
}
Object result = fel.eval(expression);
return result;
} }
} }

@ -469,25 +469,29 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
if (CollectionUtils.isEmpty(task)) { if (CollectionUtils.isEmpty(task)) {
throw new CustomException("流程未启动或已执行完成,取消申请失败"); throw new CustomException("流程未启动或已执行完成,取消申请失败");
} }
// 获取当前需撤回的流程实例
SysUser loginUser = SecurityUtils.getLoginUser().getUser();
ProcessInstance processInstance = ProcessInstance processInstance =
runtimeService.createProcessInstanceQuery().processInstanceId(flowTaskVo.getInstanceId()).singleResult(); runtimeService.createProcessInstanceQuery()
.processInstanceId(flowTaskVo.getInstanceId())
.singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId()); BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
if (Objects.nonNull(bpmnModel)) { if (Objects.nonNull(bpmnModel)) {
Process process = bpmnModel.getMainProcess(); Process process = bpmnModel.getMainProcess();
List<EndEvent> endNodes = process.findFlowElementsOfType(EndEvent.class, false); List<EndEvent> endNodes = process.findFlowElementsOfType(EndEvent.class, false);
if (CollectionUtils.isNotEmpty(endNodes)) { if (CollectionUtils.isNotEmpty(endNodes)) {
SysUser loginUser = SecurityUtils.getLoginUser().getUser();
Authentication.setAuthenticatedUserId(loginUser.getUserId().toString()); Authentication.setAuthenticatedUserId(loginUser.getUserId().toString());
// taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.STOP.getType(), // taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.STOP.getType(),
// StringUtils.isBlank(flowTaskVo.getComment()) ? "取消申请" : flowTaskVo.getComment()); // StringUtils.isBlank(flowTaskVo.getComment()) ? "取消申请" : flowTaskVo.getComment());
// 获取当前流程最后一个节点
String endId = endNodes.get(0).getId(); String endId = endNodes.get(0).getId();
List<Execution> executions = List<Execution> executions =
runtimeService.createExecutionQuery().parentId(processInstance.getProcessInstanceId()).list(); runtimeService.createExecutionQuery().parentId(processInstance.getProcessInstanceId()).list();
List<String> executionIds = new ArrayList<>(); List<String> executionIds = new ArrayList<>();
executions.forEach(execution -> executionIds.add(execution.getId())); 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 @Override
public AjaxResult getNextFlowNode(FlowTaskVo flowTaskVo) { public AjaxResult getNextFlowNode(FlowTaskVo flowTaskVo) {
// Step 1. 获取当前节点并找到下一步节点
Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult(); Task task = taskService.createTaskQuery().taskId(flowTaskVo.getTaskId()).singleResult();
FlowNextDto flowNextDto = new FlowNextDto(); FlowNextDto flowNextDto = new FlowNextDto();
if (Objects.nonNull(task)) { if (Objects.nonNull(task)) {
List<UserTask> nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, new HashMap<>()); // Step 2. 获取当前流程所有流程变量(网关节点时需要校验表达式)
Map<String, Object> variables = taskService.getVariables(task.getId());
List<UserTask> nextUserTask = FindNextNodeUtil.getNextUserTasks(repositoryService, task, variables);
if (CollectionUtils.isNotEmpty(nextUserTask)) { if (CollectionUtils.isNotEmpty(nextUserTask)) {
for (UserTask userTask : nextUserTask) { for (UserTask userTask : nextUserTask) {
MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics(); MultiInstanceLoopCharacteristics multiInstance = userTask.getLoopCharacteristics();

Loading…
Cancel
Save