Explorar o código

add 添加获取节点接口

gssong hai 3 meses
pai
achega
21c12a791a

+ 11 - 0
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/controller/FlwTaskController.java

@@ -12,6 +12,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.warm.flow.core.entity.Node;
+import org.dromara.warm.flow.orm.entity.FlowNode;
 import org.dromara.workflow.common.ConditionalOnEnable;
 import org.dromara.workflow.domain.bo.*;
 import org.dromara.workflow.domain.vo.FlowHisTaskVo;
@@ -127,6 +128,16 @@ public class FlwTaskController extends BaseController {
         return R.ok(flwTaskService.selectById(taskId));
     }
 
+    /**
+     * 获取下一节点信息
+     *
+     * @param bo 参数
+     */
+    @PostMapping("/getNextNodeList")
+    public R<List<FlowNode>> getNextNodeList(@RequestBody FlowNextNodeBo bo) {
+        return R.ok(flwTaskService.getNextNodeList(bo));
+    }
+
     /**
      * 终止任务
      *

+ 38 - 0
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/bo/FlowNextNodeBo.java

@@ -0,0 +1,38 @@
+package org.dromara.workflow.domain.bo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * 下一节点信息
+ *
+ * @author may
+ */
+@Data
+public class FlowNextNodeBo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+    /**
+     * 任务id
+     */
+    private String taskId;
+
+    /**
+     * 流程变量
+     */
+    private Map<String, Object> variables;
+
+    public Map<String, Object> getVariables() {
+        if (variables == null) {
+            return new HashMap<>(16);
+        }
+        variables.entrySet().removeIf(entry -> Objects.isNull(entry.getValue()));
+        return variables;
+    }
+}

+ 5 - 0
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/domain/vo/FlowTaskVo.java

@@ -178,6 +178,11 @@ public class FlowTaskVo implements Serializable {
     @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy")
     private String createByName;
 
+    /**
+     * 是否为申请人节点
+     */
+    private boolean applyNode;
+
     /**
      * 按钮权限
      */

+ 8 - 0
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwTaskService.java

@@ -133,6 +133,14 @@ public interface IFlwTaskService {
      */
     FlowTaskVo selectById(Long taskId);
 
+    /**
+     * 获取下一节点信息
+     *
+     * @param bo 参数
+     * @return 结果
+     */
+    List<FlowNode> getNextNodeList(FlowNextNodeBo bo);
+
     /**
      * 按照任务id查询任务
      *

+ 47 - 6
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java

@@ -30,6 +30,8 @@ import org.dromara.warm.flow.core.entity.*;
 import org.dromara.warm.flow.core.enums.NodeType;
 import org.dromara.warm.flow.core.enums.SkipType;
 import org.dromara.warm.flow.core.service.*;
+import org.dromara.warm.flow.core.utils.ExpressionUtil;
+import org.dromara.warm.flow.core.utils.MapUtil;
 import org.dromara.warm.flow.orm.entity.*;
 import org.dromara.warm.flow.orm.mapper.FlowHisTaskMapper;
 import org.dromara.warm.flow.orm.mapper.FlowInstanceMapper;
@@ -45,6 +47,7 @@ import org.dromara.workflow.handler.FlowProcessEventHandler;
 import org.dromara.workflow.handler.WorkflowPermissionHandler;
 import org.dromara.workflow.mapper.FlwCategoryMapper;
 import org.dromara.workflow.mapper.FlwTaskMapper;
+import org.dromara.workflow.service.IFlwTaskAssigneeService;
 import org.dromara.workflow.service.IFlwTaskService;
 import org.dromara.workflow.utils.WorkflowUtils;
 import org.springframework.stereotype.Service;
@@ -81,6 +84,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
     private final FlwTaskMapper flwTaskMapper;
     private final FlwCategoryMapper flwCategoryMapper;
     private final FlowNodeMapper flowNodeMapper;
+    private final IFlwTaskAssigneeService flwTaskAssigneeService;
 
     /**
      * 启动任务
@@ -491,13 +495,49 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
         flowTaskVo.setBusinessId(instance.getBusinessId());
         //设置按钮权限
         FlowNode flowNode = getByNodeCode(flowTaskVo.getNodeCode(), instance.getDefinitionId());
-        if (ObjectUtil.isNotNull(flowNode)) {
-            flowTaskVo.setButtonList(flowTaskVo.getButtonList(flowNode.getExt()));
-            flowTaskVo.setNodeRatio(flowNode.getNodeRatio());
+        if (ObjectUtil.isNull(flowNode)) {
+            throw new NullPointerException("当前【" + flowTaskVo.getNodeCode() + "】节点编码不存在");
         }
+        flowTaskVo.setButtonList(flowTaskVo.getButtonList(flowNode.getExt()));
+        flowTaskVo.setNodeRatio(flowNode.getNodeRatio());
+        flowTaskVo.setApplyNode(flowNode.getNodeCode().equals(WorkflowUtils.applyNodeCode(task.getDefinitionId())));
         return flowTaskVo;
     }
 
+    /**
+     * 获取下一节点信息
+     *
+     * @param bo 参数
+     */
+    @Override
+    public List<FlowNode> getNextNodeList(FlowNextNodeBo bo) {
+        String taskId = bo.getTaskId();
+        Map<String, Object> variables = bo.getVariables();
+        Task task = taskService.getById(taskId);
+        Instance instance = insService.getById(task.getInstanceId());
+        Definition definition = defService.getById(task.getDefinitionId());
+        //获取下一节点列表
+        List<Node> nextNodeList = nodeService.getNextNodeList(task.getDefinitionId(), task.getNodeCode(), null, SkipType.PASS.getKey(), variables);
+        if (CollUtil.isNotEmpty(nextNodeList)) {
+            //构建以下节点数据
+            List<Task> buildTaskList = StreamUtils.toList(nextNodeList, node -> taskService.addTask(node, instance, definition, null));
+            //办理人变量替换
+            ExpressionUtil.evalVariable(buildTaskList, MapUtil.mergeAll(instance.getVariableMap(), variables));
+            for (Node nextNode : nextNodeList) {
+                buildTaskList.stream().filter(t -> t.getNodeCode().equals(nextNode.getNodeCode())).findFirst().ifPresent(t -> {
+                    nextNode.setPermissionFlag(StringUtils.join(t.getPermissionList(), StringUtils.SEPARATOR));
+                });
+            }
+            List<FlowNode> flowNodes = BeanUtil.copyToList(nextNodeList, FlowNode.class);
+            for (FlowNode flowNode : flowNodes) {
+                if (StringUtils.isNotBlank(flowNode.getPermissionFlag())) {
+                    flwTaskAssigneeService.fetchUsersByStorageId(flowNode.getPermissionFlag());
+                }
+            }
+        }
+        return BeanUtil.copyToList(nextNodeList, FlowNode.class);
+    }
+
     /**
      * 按照任务id查询任务
      *
@@ -580,10 +620,11 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
         }
 
         Long taskId = bo.getTaskId();
-        FlowTaskVo flowTaskVo = selectById(taskId);
+        Task task = taskService.getById(taskId);
+        FlowNode flowNode = getByNodeCode(task.getNodeCode(), task.getDefinitionId());
         if ("addSignature".equals(taskOperation) || "reductionSignature".equals(taskOperation)) {
-            if (flowTaskVo.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) {
-                throw new ServiceException(flowTaskVo.getNodeName() + "不是会签节点!");
+            if (flowNode.getNodeRatio().compareTo(BigDecimal.ZERO) == 0) {
+                throw new ServiceException(task.getNodeName() + "不是会签节点!");
             }
         }
         // 设置任务状态并执行对应的任务操作