跳转至

工作流元素继承体系(Element / Node / Relation)

位置:obpm-core/.../runtime/workflow/element/(含 GatewayNode、FlowTemplateBinder)+ storage/runtime/ejb/(运行态)。基类体系见 [[entity-base-hierarchy]];.flow 文件 Schema 见 [[../../workspace-mechanism/xml-schemas/flow-file]]。

1. 设计态:流程图元素(element 包)

与表单字段同款思路——抽象层级管画布公共态,叶子里放节点语义:

classDiagram
    class Serializable
    class Element {
        <<abstract>>
        +String id
        +name/statelabel 等扁平字段
        +toXML() String
        +toJSON() String
    }
    class PaintElement {
        <<abstract>>
        #int x, y
        画布坐标
    }
    class Node {
        <<abstract>>
        节点公共:orderNum/回退三件套等
    }
    class StartNode
    class CompleteNode
    class ManualNode
    class AutoNode
    class SubFlow
    class GatewayNode
    class Relation {
        startnodeid → endnodeid
        condition/action 脚本
    }
    class FlowDiagram {
        图容器:nodes + relations
        flowstatus/width/height
    }
    class Actor {
        参与者元素
    }
    class NodeActivity {
        节点子活动项
    }

    Serializable <|.. Element
    Element <|-- PaintElement
    PaintElement <|-- Node
    PaintElement <|-- Relation
    Node <|-- StartNode
    Node <|-- CompleteNode
    Node <|-- ManualNode
    Node <|-- AutoNode
    Node <|-- SubFlow
    Node <|-- GatewayNode
    Element <|-- Actor
    Element <|-- NodeActivity
    Element <|-- FlowDiagram
    FlowDiagram o-- "*" Node
    FlowDiagram o-- "*" Relation

层级职责

层 职责
Element(抽象) 一切图元素根:id/name;toXML() 保留;新建落盘 toJSON()(短 className + 扁平字段 + subelems)
PaintElement(抽象) 增加画布坐标 x/y——设计器可拖拽的一切
Node(抽象) 节点公共语义:statelabel(对外状态名)、orderNum、回退三件套(cBack/backType/bnodelist)、并行标记(issplit/isgather)
Relation 继承 PaintElement(线也可拖),但**不继承 Node**:startnodeid→endnodeid 引用 + condition(路径条件脚本)/action(过线脚本)
FlowDiagram 容器根:整体作为 <flow> CDATA 嵌入 BillDefiVO 外壳(新建为 JSON 字符串,旧 XML 仍可加载)
GatewayNode 网关叶子;可进图。运行时并行/聚合若引擎 instanceof 尚未包含此类,仍用 Manual/Auto 的 issplit/isgather

关键设计:Relation 与 Node 平行而非嵌套——图 = 节点集 + 边集的扁平二元组,校验拓扑(validateFlow:Start 入 0 出 ≥1 等)只需遍历两个集合。JSON 绑定走 FlowTemplateBinder(短名 switch + applyFields/writeFields,禁止反射)。GatewayNode 已有 Java 类可进图;可运行并行仍可落在 ManualNode/AutoNode 的 issplit/isgather。

2. 运行态:RT 三剑客(storage/runtime/ejb 包)

设计态图被**实例化**为三张运行时表的实体(均直接继承 ValueObject):

classDiagram
    class ValueObject
    class FlowStateRT {
        流程实例
        DOCID/FLOWID/STATE
        FLOWXML 快照
    }
    class NodeRT {
        节点实例
        NODEID(引用定义)
        FLOWSTATERT_ID
        SPLITTOKEN
    }
    class ActorRT {
        待办人实例
        ACTORID/ISPROCESSED
        NODERT_ID
        DEADLINE
    }
    class CoActorRT {
        协办
    }
    class Circulator {
        抄送
    }
    class FlowHistoryVO {
        审批历史
    }
    class WorkflowProxyVO {
        流程代理
    }
    class FlowInterventionVO {
        流程干预
    }

    ValueObject <|-- FlowStateRT
    ValueObject <|-- NodeRT
    ValueObject <|-- ActorRT
    ValueObject <|-- CoActorRT
    ValueObject <|-- Circulator
    ValueObject <|-- FlowHistoryVO
    ValueObject <|-- WorkflowProxyVO
    ValueObject <|-- FlowInterventionVO
    FlowStateRT "1" o-- "*" NodeRT : docid/flowstatert_id
    NodeRT "1" o-- "*" ActorRT : nodert_id

定义与实例的对应

设计态(定义) 运行态(表) 关系
BillDefiVO(外壳) FlowStateRT(T_FLOWSTATERT) 一次发起 = 一个实例;FLOWXML 存图快照(流程改版不影响在途实例)
Node(定义) NodeRT(T_NODERT) NODEID 引用定义 id;同一定义可多次实例化(驳回重走)
Actor/审批人配置 ActorRT(T_ACTORRT) ISPROCESSED 标记办理;DEADLINE 时限
Relation 走向 FlowHistoryVO(T_FLOWHISTORY) 历史"轨迹"不删改,追加记录

实例化时机(工作机制):

sequenceDiagram
    participant U as 用户
    participant A as Activity(type=4/33)
    participant F as FlowStateRT
    participant N as NodeRT
    participant AC as ActorRT
    participant D as Document

    U->>A: 提交(表单工具栏)
    A->>D: 保存文档(TLK_)
    A->>F: 创建流程实例(快照 FLOWXML)
    F->>N: 实例化起草 NodeRT
    N->>AC: 为审批人生成 ActorRT 待办
    U->>AC: 办理(通过/回退)
    AC->>N: 标记 ISPROCESSED
    N->>N: 按 Relation(condition) 找下一节点 → 循环实例化
    N->>F: 到 CompleteNode → COMPLETE=true

Document.STATELABEL 由当前节点的 Node.statelabel 拷贝/聚合(多节点逗号拼接),驱动按钮 stateToShow 与字段脚本显隐——这是表单与流程联动的核心链路。