add 添加获取节点接口

This commit is contained in:
gssong 2025-03-03 21:02:03 +08:00
parent c4ef053958
commit 21c12a791a
5 changed files with 109 additions and 6 deletions

View File

@ -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));
}
/**
* 终止任务
*

View File

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

View File

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

View File

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

View File

@ -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() + "不是会签节点!");
}
}
// 设置任务状态并执行对应的任务操作