mirror of
				https://github.com/dromara/RuoYi-Vue-Plus.git
				synced 2025-11-04 08:13:44 +08:00 
			
		
		
		
	add 添加获取节点接口
This commit is contained in:
		@@ -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));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 终止任务
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -178,6 +178,11 @@ public class FlowTaskVo implements Serializable {
 | 
			
		||||
    @Translation(type = TransConstant.USER_ID_TO_NICKNAME, mapper = "createBy")
 | 
			
		||||
    private String createByName;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 是否为申请人节点
 | 
			
		||||
     */
 | 
			
		||||
    private boolean applyNode;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 按钮权限
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -133,6 +133,14 @@ public interface IFlwTaskService {
 | 
			
		||||
     */
 | 
			
		||||
    FlowTaskVo selectById(Long taskId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获取下一节点信息
 | 
			
		||||
     *
 | 
			
		||||
     * @param bo 参数
 | 
			
		||||
     * @return 结果
 | 
			
		||||
     */
 | 
			
		||||
    List<FlowNode> getNextNodeList(FlowNextNodeBo bo);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 按照任务id查询任务
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -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() + "不是会签节点!");
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // 设置任务状态并执行对应的任务操作
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user