Appearance
规范 07 · 元数据能力
前端流程设计器的配置项依赖两类只有引擎自己知道的元数据(值漂移问题的设计论证见 设计原理 08 · 引擎元数据):
- 内置状态枚举字典——流程定义/实例/任务状态、提交类型等(value/label 来自引擎枚举);
- SPI 实现清单——可用的 AssignmentHandler / CandidateHandler / FlowInterceptor (显示名/排序/分组,与运行时加载的 handlerName 天然一致)。
枚举字典
key 约定:wf_ + 枚举名转下划线,与 boot3/mldong 框架字典 key 完全一致,存量前端零改动。 枚举新增/变更自动反映到字典,集成方无需同步。
| 字典 key | 枚举(Java) | 值(value=code, label=message) |
|---|---|---|
wf_process_define_state | ProcessDefineStateEnum | 0 禁用 / 1 启用 |
wf_process_instance_state | ProcessInstanceStateEnum | 10 进行中 / 20 已完成 / 30 已撤回 / 40 强行终止 / 45 已拒绝 / 50 挂起 / 99 已废弃 |
wf_process_submit_type | ProcessSubmitTypeEnum | 0 发起申请 / 1 同意申请 / 2 拒绝申请 / 3 退回上一步 / 4 跳转 / 5 重新提交 / 6 退回发起人 / 20 拒绝申请 |
wf_process_task_state | ProcessTaskStateEnum | 10 进行中 / 20 已完成 / 30 已撤回 / 40 强行终止 / 50 挂起 / 99 已废弃 |
wf_process_task_type | ProcessTaskTypeEnum | 0 主办 / 1 协办 / 2 记录 |
wf_process_task_perform_type | ProcessTaskPerformTypeEnum | 0 普通参与 / 1 会签参与 |
wf_countersign_type | CountersignTypeEnum | 0 并行会签 / 1 串行会签 |
四语言 API(各返回 [{value, label}],未知 key 返回空列表):
| 能力 | Java | Go | Python | Node |
|---|---|---|---|---|
| 字典 key 清单 | EnumDictRegistry.listDictKeys() | metadata.EnumDictKeys() | enum_dict_keys() | enumDictKeys() |
| 按 key 取字典 | EnumDictRegistry.getDict(key) | metadata.EnumDict(key) | enum_dict(key) | enumDict(key) |
Java 枚举统一实现 IDictEnum(getCode/getMessage),注册表直接由枚举生成; Go/Python/Node 引擎新增完整字典枚举(InstanceState/TaskState 补齐 WITHDRAW/INTERRUPT/PENDING 等值,新增 DefineState/SubmitType/TaskType/PerformType/CountersignType), 值全部对齐上表。
SPI 实现清单(HandlerRegistry,注册式)
引擎按 handlerName/类名懒加载处理器(Java Class.forName,其余语言扩展点函数分发), 本身不感知"有哪些可用实现"。HandlerRegistry 让集成方显式登记可用实现及元数据, 作为「SPI 实现清单」字典源——字典 value(handlerName/类名)与运行时配置天然一致。
元数据形态(HandlerMeta):
| 字段 | 说明 |
|---|---|
| type / typeName | 处理器类型(AssignmentHandler / CandidateHandler / FlowInterceptor) |
| className / name | 处理器标识:Java 类全名(Class.forName 加载),其余语言节点配置的 handlerName(字典 value) |
| displayName | 显示名(字典 label) |
| order | 排序(小在前) |
| group | 分组(拦截器 pre/post 显式声明;其余可为空) |
四语言 API:
| 能力 | Java | Go | Python | Node |
|---|---|---|---|---|
| 注册 | register(HandlerMeta) / register(type, className, displayName, order, group) | Register(HandlerMeta) | register(HandlerMeta) | registerAssignment(name, handler, meta?) / registerDecision(...) |
| 按类型列出 | listHandlers(Class<T>) | ListHandlers(typeName) | list_handlers(type_name) | listHandlers(typeName) |
| 按类型+分组 | listHandlers(Class<T>, group) | ListHandlersGroup(typeName, group) | list_handlers_group(type_name, group) | listHandlersGroup(typeName, group) |
| 类型清单 | listHandlerTypes() | ListHandlerTypes() | list_handler_types() | listHandlerNames() |
可选能力:不注册不影响引擎现有加载行为(Java 仍走 Class.forName,其余语言仍走扩展点函数)。 集成方(boot4)的 4 个扫描器塌缩为 1 个 CustomDictService 薄映射:扫描结果 → 注册 → 字典直接来自
listHandlers。