Skip to content
Merged

Dev #53

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.codingapi.flow.node;

/**
* 流程审批中呈现的节点
* 在流程审批过程中可界面的节点,包括{@link com.codingapi.flow.node.nodes.StartNode}{@link com.codingapi.flow.node.nodes.EndNode} 等节点
* 过滤条件节点例如 {@link com.codingapi.flow.node.nodes.ConditionNode} {@link com.codingapi.flow.node.nodes.ConditionBranchNode} 等逻辑控制节点
*/
public interface IDisplayNode {

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.codingapi.flow.action.actions.*;
import com.codingapi.flow.builder.BaseNodeBuilder;
import com.codingapi.flow.node.BaseAuditNode;
import com.codingapi.flow.node.IDisplayNode;
import com.codingapi.flow.node.NodeType;
import com.codingapi.flow.strategy.node.*;
import com.codingapi.flow.utils.RandomUtils;
Expand All @@ -15,7 +16,7 @@
/**
* 审批节点
*/
public class ApprovalNode extends BaseAuditNode {
public class ApprovalNode extends BaseAuditNode implements IDisplayNode {

public static final String NODE_TYPE = NodeType.APPROVAL.name();
public static final String DEFAULT_NAME = "审批节点";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.codingapi.flow.domain.DelayTaskManager;
import com.codingapi.flow.manager.NodeStrategyManager;
import com.codingapi.flow.node.BaseFlowNode;
import com.codingapi.flow.node.IDisplayNode;
import com.codingapi.flow.node.NodeType;
import com.codingapi.flow.record.FlowRecord;
import com.codingapi.flow.session.FlowSession;
Expand All @@ -19,7 +20,7 @@
/**
* 延迟节点
*/
public class DelayNode extends BaseFlowNode {
public class DelayNode extends BaseFlowNode implements IDisplayNode {

public static final String NODE_TYPE = NodeType.DELAY.name();
public static final String DEFAULT_NAME = "延迟节点";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.codingapi.flow.context.RepositoryHolderContext;
import com.codingapi.flow.event.FlowRecordFinishEvent;
import com.codingapi.flow.node.BaseFlowNode;
import com.codingapi.flow.node.IDisplayNode;
import com.codingapi.flow.node.NodeType;
import com.codingapi.flow.record.FlowRecord;
import com.codingapi.flow.session.FlowSession;
Expand All @@ -18,7 +19,7 @@
/**
* 结束节点
*/
public class EndNode extends BaseFlowNode {
public class EndNode extends BaseFlowNode implements IDisplayNode {

public static final String NODE_TYPE = NodeType.END.name();
public static final String DEFAULT_NAME = "结束节点";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.codingapi.flow.action.actions.PassAction;
import com.codingapi.flow.builder.BaseNodeBuilder;
import com.codingapi.flow.node.BaseAuditNode;
import com.codingapi.flow.node.IDisplayNode;
import com.codingapi.flow.node.NodeType;
import com.codingapi.flow.strategy.node.*;
import com.codingapi.flow.utils.RandomUtils;
Expand All @@ -15,7 +16,7 @@
/**
* 办理节点
*/
public class HandleNode extends BaseAuditNode {
public class HandleNode extends BaseAuditNode implements IDisplayNode {

public static final String NODE_TYPE = NodeType.HANDLE.name();
public static final String DEFAULT_NAME = "办理节点";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.codingapi.flow.manager.NodeStrategyManager;
import com.codingapi.flow.manager.OperatorManager;
import com.codingapi.flow.node.BaseAuditNode;
import com.codingapi.flow.node.IDisplayNode;
import com.codingapi.flow.node.NodeType;
import com.codingapi.flow.operator.IFlowOperator;
import com.codingapi.flow.record.FlowRecord;
Expand All @@ -20,7 +21,7 @@
/**
* 抄送节点
*/
public class NotifyNode extends BaseAuditNode {
public class NotifyNode extends BaseAuditNode implements IDisplayNode {

public static final String NODE_TYPE = NodeType.NOTIFY.name();
public static final String DEFAULT_NAME = "抄送节点";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.codingapi.flow.form.FormMeta;
import com.codingapi.flow.manager.NodeStrategyManager;
import com.codingapi.flow.node.BaseFlowNode;
import com.codingapi.flow.node.IDisplayNode;
import com.codingapi.flow.node.IFlowNode;
import com.codingapi.flow.node.NodeType;
import com.codingapi.flow.session.FlowSession;
Expand All @@ -20,7 +21,7 @@
/**
* 路由分支节点
*/
public class RouterNode extends BaseFlowNode {
public class RouterNode extends BaseFlowNode implements IDisplayNode {

public static final String NODE_TYPE = NodeType.ROUTER.name();
public static final String DEFAULT_NAME = "路由节点";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.codingapi.flow.context.GatewayContext;
import com.codingapi.flow.manager.NodeStrategyManager;
import com.codingapi.flow.node.BaseFlowNode;
import com.codingapi.flow.node.IDisplayNode;
import com.codingapi.flow.node.NodeType;
import com.codingapi.flow.operator.IFlowOperator;
import com.codingapi.flow.record.FlowRecord;
Expand All @@ -27,7 +28,7 @@
/**
* 开始节点
*/
public class StartNode extends BaseFlowNode {
public class StartNode extends BaseFlowNode implements IDisplayNode {

public static final String NODE_TYPE = NodeType.START.name();
public static final String DEFAULT_NAME = "开始节点";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.codingapi.flow.builder.BaseNodeBuilder;
import com.codingapi.flow.manager.NodeStrategyManager;
import com.codingapi.flow.node.BaseFlowNode;
import com.codingapi.flow.node.IDisplayNode;
import com.codingapi.flow.node.NodeType;
import com.codingapi.flow.session.FlowSession;
import com.codingapi.flow.strategy.node.INodeStrategy;
Expand All @@ -16,7 +17,7 @@
/**
* 子流程
*/
public class SubProcessNode extends BaseFlowNode {
public class SubProcessNode extends BaseFlowNode implements IDisplayNode {

public static final String NODE_TYPE = NodeType.SUB_PROCESS.name();
public static final String DEFAULT_NAME = "子流程";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.codingapi.flow.builder.BaseNodeBuilder;
import com.codingapi.flow.manager.NodeStrategyManager;
import com.codingapi.flow.node.BaseFlowNode;
import com.codingapi.flow.node.IDisplayNode;
import com.codingapi.flow.node.NodeType;
import com.codingapi.flow.session.FlowSession;
import com.codingapi.flow.strategy.node.INodeStrategy;
Expand All @@ -16,7 +17,7 @@
/**
* 触发节点
*/
public class TriggerNode extends BaseFlowNode {
public class TriggerNode extends BaseFlowNode implements IDisplayNode {

public static final String NODE_TYPE = NodeType.TRIGGER.name();
public static final String DEFAULT_NAME = "触发节点";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.codingapi.flow.pojo.response;

import com.codingapi.flow.node.IDisplayNode;
import com.codingapi.flow.node.IFlowNode;
import com.codingapi.flow.operator.IFlowOperator;
import com.codingapi.flow.record.FlowRecord;
Expand Down Expand Up @@ -35,6 +36,11 @@ public class ProcessNode {
*/
private String nodeType;

/**
* 是否呈现节点
*/
private boolean display;

/**
* 记录状态
* -1 为历史状态
Expand All @@ -59,6 +65,7 @@ public ProcessNode(FlowRecord flowRecord, Workflow workflow) {
this.nodeName = flowNode.getName();
this.nodeType = flowNode.getType();
this.operators = new ArrayList<>();
this.display = true;
this.state = STATE_HISTORY;
this.operators.add(new FlowOperatorBody(flowRecord));
}
Expand All @@ -70,6 +77,7 @@ public ProcessNode(IFlowNode flowNode, List<IFlowOperator> operators) {
this.nodeType = flowNode.getType();
this.operators = operators.stream().map(FlowOperatorBody::new).toList();
this.state = STATE_NEXT;
this.display = flowNode instanceof IDisplayNode;
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,24 +121,10 @@ private class NextNodeLoader {
@Getter
private final List<ProcessNode> nodeList;
private final IFlowNode currentNode;
private final List<String> displayNodeTypes;

public NextNodeLoader(IFlowNode currentNode) {
this.currentNode = currentNode;
this.nodeList = new ArrayList<>();
this.displayNodeTypes = new ArrayList<>();
this.initDisplayNodeTypes();
}


private void initDisplayNodeTypes() {
this.displayNodeTypes.add(NodeType.START.name());
this.displayNodeTypes.add(NodeType.END.name());
this.displayNodeTypes.add(NodeType.APPROVAL.name());
this.displayNodeTypes.add(NodeType.NOTIFY.name());
this.displayNodeTypes.add(NodeType.HANDLE.name());
this.displayNodeTypes.add(NodeType.TRIGGER.name());
this.displayNodeTypes.add(NodeType.SUB_PROCESS.name());
}

private void fetchNextNode(FlowSession flowSession, List<IFlowNode> nexNodes) {
Expand All @@ -164,7 +150,7 @@ private void fetchNextNode(FlowSession flowSession, List<IFlowNode> nexNodes) {
public List<ProcessNode> loadNextNode(FlowSession flowSession) {
this.fetchNextNode(flowSession,List.of(this.currentNode));

List<ProcessNode> displayNodes = nodeList.stream().filter(node-> this.displayNodeTypes.contains(node.getNodeType())).toList();
List<ProcessNode> displayNodes = nodeList.stream().filter(ProcessNode::isDisplay).toList();
List<ProcessNode> processNodeList = new ArrayList<>();
for (ProcessNode node:displayNodes){
if(!processNodeList.contains(node)){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.codingapi.flow.form.FormMetaBuilder;
import com.codingapi.flow.form.permission.PermissionType;
import com.codingapi.flow.gateway.impl.UserGateway;
import com.codingapi.flow.node.IDisplayNode;
import com.codingapi.flow.node.IFlowNode;
import com.codingapi.flow.node.nodes.*;
import com.codingapi.flow.strategy.node.FormFieldPermissionStrategy;
Expand Down Expand Up @@ -157,10 +158,14 @@ void backNodes() {

List<IFlowNode> nackNodes = workflow.getNackNodes(endNode);
assertEquals(2, nackNodes.size());
assertEquals(2, nackNodes.stream().filter(node->node instanceof IDisplayNode).toList().size());
assertTrue(nackNodes.contains(startNode));
assertTrue(nackNodes.contains(approvalNode));
assertFalse(nackNodes.contains(endNode));

List<IFlowNode> nodes = workflow.getNodes();
assertEquals(3, nodes.size());
assertEquals(3, nodes.stream().filter(node->node instanceof IDisplayNode).toList().size());

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ public Response remove(@RequestBody IdRequest request) {
@PostMapping("/changeState")
public Response changeState(@RequestBody IdRequest request) {
Workflow workflow = workflowRepository.get(request.getStringId());
if(workflow.isDisable()){
if (workflow.isDisable()) {
workflow.enable();
}else {
} else {
workflow.disable();
}
workflowRepository.save(workflow);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.codingapi.flow.api.pojo;

import lombok.Data;

@Data
public class BackNodeRequest {

private String workId;
private String nodeId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.codingapi.flow.api.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SelectOption {

private String value;
private String label;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import {useDesignContext} from "@/components/design-panel/hooks/use-design-context";
import {NodeRouterManager} from "@/components/design-panel/manager/node";

export const useNodeRouterManager = ()=>{
const {state} = useDesignContext();
const nodes = state.workflow.nodes || [];
return new NodeRouterManager(nodes);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import {FlowNode} from "@/components/design-panel/types";

export class NodeManager {
/**
* 节点数据转换服务
*/
export class NodeConvertorManager {

public static readonly STRATEGY_SUFFIX = 'Strategy';
public static readonly STRATEGY_KEY = 'strategyType';
Expand Down Expand Up @@ -60,7 +63,7 @@ export class NodeManager {

for (let i = 0; i < strategies.length; i++) {
const strategy = strategies[i];
const key = strategy[NodeManager.STRATEGY_KEY];
const key = strategy[NodeConvertorManager.STRATEGY_KEY];
strategyMap[key] = {
...strategy
}
Expand All @@ -74,15 +77,47 @@ export class NodeManager {
const keys = Object.keys(node);
const strategies: any[] = [];
for (const key of keys) {
if (key.endsWith(NodeManager.STRATEGY_SUFFIX)) {
if (key.endsWith(NodeConvertorManager.STRATEGY_SUFFIX)) {
const strategy = node[key];
strategies.push({
[NodeManager.STRATEGY_KEY]: key,
[NodeConvertorManager.STRATEGY_KEY]: key,
...strategy,
});
}
}
return strategies;
}

}

/**
* 节点关系分析管理,分析所有的节点,可回退的节点等信息
*/
export class NodeRouterManager {
private readonly nodes: FlowNode[];

constructor(nodes: FlowNode[]) {
this.nodes = nodes;
}

public size() {
return this.nodes.length;
}

/**
* 查看全部的可选节点
* TODO 需要对blocks的节点进行展开查看,并提出条件控制节点
*/
public getNodes() {
return this.nodes;
}

/**
* 获取可退回的节点
* TODO 需要对blocks的节点进行展开查看,并提出条件控制节点
* @param nodeId
*/
public getBackNodes(nodeId: string) {
return this.nodes;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import {DesignPanelApi, FlowNode, initStateData, State, TabPanelType} from "../t
import {Dispatch} from "@flow-engine/flow-core";
import {FormActionContext} from "@/components/design-panel/presenters/form";
import {WorkflowFormManager} from "@/components/design-panel/manager/form";
import {NodeManager} from "@/components/design-panel/manager/node";
import {NodeConvertorManager} from "@/components/design-panel/manager/node";
import {WorkflowConvertor} from "@/components/design-panel/presenters/convertor";

export class Presenter {
Expand Down Expand Up @@ -128,7 +128,7 @@ export class Presenter {

public async createNode(form: string, type: string) {
const flowNode = await this.api.createNode(type);
const nodeManager = new NodeManager();
const nodeManager = new NodeConvertorManager();
return nodeManager.toItemRender(flowNode);
}

Expand Down
Loading