工作流元素继承体系(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 与字段脚本显隐——这是表单与流程联动的核心链路。