-
节点应当继承
com.example.demoworkflow.utils.workflow.nodes.NodeImpl,并在相应的Hook中实现对应的功能。 -
节点前置Hook(
before)。应当在此处加载节点的配置相关信息,通过用户的配置项初始化节点运行所需的所有变量,当节点配置不满足运行节点的需求时,应当调用onNodeError方法或onNodeDisabled方法以终止流程或当前所在分支的运行。 -
节点运行Hook(
run)。在此处实现节点运行的核心逻辑,并将运行中可能需要向用户输出的结果通过globalPool.pushWorkflowResult方法输出;需要在运行结束后写入全局变量的数据应当通过nodePool.put方法写入,而不是直接向globalPool写入。 -
节点后置Hook(
after)。在此清理运行时产生的对象或过滤节点运行结果。 -
节点在创建后,应当在
com.example.demoworkflow.utils.types.NodeType中写入一个新的节点类型,并在静态方法中将新建的节点类放入nodeClazzMap。新建结果类型后,其相应的结果类型也应当在新建的节点初始化函数中使用setNodeType方法指定。 -
节点若有默认的配置项,应当重写
getNodeConfigs方法,便于前端获取使用。 -
节点若有默认的输出项,应当重写
getNodeOutputs方法,便于前端获取使用。
-
新的状态根据状态所属的实体类型(工作流、节点、结果处理),在相应的状态类中新建。其中,最好是按位划分状态,使得在状态使用时可以直接通过位运算符判断运行状态。其中,
-1与0x1为预留的NULL态与ERROR态,分别代表“空”和“错误”,不应当对其进行更改。// 判断节点状态是否处于失能态或完成态 return state & (NodeStates.DONE | NodeStates.DISABLED) != 0;
-
状态代码在定义时应当写为16进制数,状态更新时不要直接通过数值直接更新,否则将会带来维护困难。
-
状态代码应当依照执行顺序逐渐变大,这样在可以通过左移运算直接更新状态信息。
-
现有的配置参考
com.example.demoworkflow.utils.workflow.nodes.NodeImpl中的parseConfig方法,新增任意类型时需要更新相应的解析方法。 -
前端需要提供相应的配置编辑方法,如
Boolean对应开关、List与Map对应可拓展表、Condition对应一个含有左值,右值,运算符的条件编辑器、Number与String对应相应的输入框、Select对应下拉框,其中Number应当含有高级选项以配置取值区间与精度和浮点除数的选项。 -
节点配置与节点的输出结果应当通过接口获取并动态生成。接口位于
com.example.demoworkflow.control.WorkflowController,方法分别为getNodeConfigsByCode与getNodeOutputsByCode。
-
根据后端定义的节点类型,前端应当定义相应的Vue-flow节点。其中
StartNode与EndNode应当显示为绿色与橙色的矩形,其它节点均为白色矩形。普通的工作节点应当至少含有一个Handler(即输出端)可供多个其它节点接入,但条件节点应根据条件数量设置Handler数量。节点不允许自指(从节点出发创建边指向自己)。 -
节点在创建后应在初始化时便在相应的对象中创建
nodeId(前端创建)。 -
节点的
String类型的配置应当通过{{nodeId:variableName}}的格式插入全局变量池中的变量,在前端中应当只能够提取当前分支以及更上游节点产生的变量,不允许插入并行分支的变量。 -
每个工作流只允许拥有一个起始节点与一个结束节点。
-
节点的连接应当允许使用快捷键
C选中连接,节点与边的删除应当能通过Del键快捷删除。