# 数据模型设计(JSON Schema,前后端统一) 版本: v1.0 规范: JSON Schema Draft-07 命名约定: camelCase;所有 ID 均为字符串;时间统一 ISO 8601(UTC)。 一、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 层(可配置)