flowable-devops/backend/docs/04-数据模型设计.md
dengqichen d42166d2c0 提交
2025-10-13 16:25:13 +08:00

193 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数据模型设计JSON Schema前后端统一
版本: v1.0
规范: JSON Schema Draft-07
命名约定: camelCase所有 ID 均为字符串;时间统一 ISO 8601UTC
一、WorkflowDefinition工作流定义
- 描述:前端编辑器生成/后端持久化与部署的核心数据结构
- 说明MVP 仅支持串行/条件分支;并行/子流程等后续引入
```json
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://example.com/schemas/workflow-definition.json",
"title": "WorkflowDefinition",
"type": "object",
"required": ["id", "name", "nodes", "edges", "schemaVersion"],
"properties": {
"id": { "type": "string", "minLength": 1 },
"name": { "type": "string", "minLength": 1 },
"description": { "type": "string" },
"schemaVersion": { "type": "string", "enum": ["1.0"] },
"nodes": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/$defs/workflowNode" }
},
"edges": {
"type": "array",
"items": { "$ref": "#/$defs/workflowEdge" }
},
"variables": { "type": "object", "additionalProperties": true },
"metadata": { "type": "object", "additionalProperties": true }
},
"$defs": {
"position": {
"type": "object",
"required": ["x", "y"],
"properties": {
"x": { "type": "number" },
"y": { "type": "number" }
}
},
"workflowNode": {
"type": "object",
"required": ["id", "type", "name", "position", "config"],
"properties": {
"id": { "type": "string", "minLength": 1 },
"type": { "type": "string", "minLength": 1 },
"name": { "type": "string", "minLength": 1 },
"position": { "$ref": "#/$defs/position" },
"config": { "type": "object", "additionalProperties": true }
}
},
"workflowEdge": {
"type": "object",
"required": ["source", "target"],
"properties": {
"id": { "type": "string" },
"source": { "type": "string", "minLength": 1 },
"target": { "type": "string", "minLength": 1 },
"condition": { "type": "string", "pattern": "^\\$\\{.*\\}$" }
}
}
}
}
```
示例(最小可用工作流)
```json
{
"id": "wf_001",
"name": "HTTP→审批→邮件",
"schemaVersion": "1.0",
"nodes": [
{"id": "n1", "type": "http_request", "name": "Get User", "position": {"x": 100, "y": 100}, "config": {"url": "https://api.example.com/users/1", "method": "GET"}},
{"id": "n2", "type": "approval", "name": "审批", "position": {"x": 320, "y": 100}, "config": {"assignee": "${workflow.input.approver}", "formFields": [{"id": "approved", "label": "同意?", "type": "boolean", "required": true}]}},
{"id": "n3", "type": "send_mail", "name": "通知", "position": {"x": 540, "y": 100}, "config": {"to": "${nodes.n1.output.body.email}", "subject": "审批已通过", "content": "Hello"}}
],
"edges": [
{"source": "n1", "target": "n2"},
{"source": "n2", "target": "n3", "condition": "${approved == true}"}
],
"variables": {"env": "dev"}
}
```
二、NodeTypeMetadata节点类型元数据
- 描述:驱动前端动态表单、字段映射、帮助用户理解节点输入/输出
- 约束id 唯一、fields 与 outputSchema 必填
```json
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://example.com/schemas/node-type-metadata.json",
"title": "NodeTypeMetadata",
"type": "object",
"required": ["id", "name", "displayName", "category", "fields", "outputSchema"],
"properties": {
"id": { "type": "string", "minLength": 1 },
"name": { "type": "string", "minLength": 1 },
"displayName": { "type": "string" },
"category": { "type": "string", "enum": ["api", "database", "logic", "notification", "transform", "other"] },
"icon": { "type": "string" },
"description": { "type": "string" },
"fields": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/$defs/fieldDefinition" }
},
"outputSchema": { "type": "object" },
"implementationClass": { "type": "string" },
"enabled": { "type": "boolean", "default": true }
},
"$defs": {
"fieldDefinition": {
"type": "object",
"required": ["name", "label", "type"],
"properties": {
"name": { "type": "string" },
"label": { "type": "string" },
"type": { "type": "string", "enum": ["text", "textarea", "number", "select", "code", "key_value", "boolean"] },
"required": { "type": "boolean", "default": false },
"supportsExpression": { "type": "boolean", "default": false },
"supportsFieldMapping": { "type": "boolean", "default": false },
"options": { "type": "array", "items": {"type": "string"} },
"defaultValue": {},
"placeholder": { "type": "string" },
"language": { "type": "string" }
}
}
}
}
```
示例HTTP Request 节点)
```json
{
"id": "http_request",
"name": "httpRequest",
"displayName": "HTTP Request",
"category": "api",
"icon": "ApiOutlined",
"description": "发送 HTTP 请求",
"fields": [
{"name": "url", "label": "URL", "type": "text", "required": true, "supportsExpression": true},
{"name": "method", "label": "Method", "type": "select", "options": ["GET", "POST", "PUT", "DELETE", "PATCH"], "defaultValue": "GET"},
{"name": "headers", "label": "Headers", "type": "key_value", "supportsFieldMapping": true},
{"name": "body", "label": "Body", "type": "code", "language": "json", "supportsExpression": true},
{"name": "timeout", "label": "Timeout(ms)", "type": "number", "defaultValue": 30000}
],
"outputSchema": {
"type": "object",
"properties": {
"statusCode": {"type": "number"},
"body": {"type": "object"},
"headers": {"type": "object"},
"elapsed": {"type": "number"}
}
}
}
```
三、表达式JUEL约定
- 统一使用 ${...}
- 可访问命名空间:
- nodes上游节点数据如 ${nodes.n1.output.body.email}
- workflow输入/变量,如 ${workflow.input.userId}
- env环境变量如 ${env.API_KEY}
- 仅 Map/属性访问;不允许方法/类引用;支持三元表达式
四、执行与日志数据(后端输出/存储)
- NodeExecutionResult内存/接口响应中的片段)
```json
{
"status": "success",
"output": {"statusCode": 200, "body": {"id": 1}},
"error": null,
"startTime": "2025-01-01T10:00:00Z",
"endTime": "2025-01-01T10:00:10Z",
"durationMs": 10
}
```
- 节点执行日志表node_execution_logs建议结构与 docs/02 一致):
- execution_id、node_id、node_type、input(JSON)、output(JSON)、status、started_at、ended_at、duration_ms、error_message
五、前后端对齐要点Checklist
- WorkflowDefinition 使用 schemaVersion 固定为 1.0
- WorkflowEdge.condition 必须为完整 ${...} 字符串
- NodeTypeMetadata.id 与 WorkflowNode.type 对齐(如 http_request
- 字段映射组件输出“完整表达式”字符串(含 ${}
- 输出结构以 outputSchema 为准;前端展示字段树最多展开 3 层(可配置)