From f783658227d1b041434c22cc83a2356f26b32958 Mon Sep 17 00:00:00 2001 From: clay Date: Sun, 4 May 2025 15:44:48 +0800 Subject: [PATCH] =?UTF-8?q?feat=20:=20swagger=20=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/metis/domain/bo/AppBO.java | 7 ++++ .../java/com/metis/domain/bo/BuildApp.java | 11 ++++- .../java/com/metis/domain/bo/CreateApp.java | 5 +++ .../main/java/com/metis/domain/bo/EdgeBO.java | 40 ++++++++++++++++++ .../java/com/metis/domain/bo/GraphBO.java | 7 ++++ .../java/com/metis/domain/bo/HandleBO.java | 5 +++ .../main/java/com/metis/domain/bo/NodeBO.java | 11 ++++- .../java/com/metis/domain/bo/NodeDataBO.java | 5 +++ .../java/com/metis/domain/bo/PositionBO.java | 4 ++ .../java/com/metis/domain/bo/UpdateApp.java | 9 ++++ .../java/com/metis/domain/bo/ViewportBo.java | 8 ++++ .../metis/domain/context/RunningContext.java | 33 ++++++++++++++- .../com/metis/domain/context/SysContext.java | 1 + .../com/metis/domain/entity/base/Edge.java | 41 ++++++++++++++++--- .../metis/domain/entity/base/NodeData.java | 5 +++ .../main/java/com/metis/domain/vo/EdgeVo.java | 37 +++++++++++++++++ .../java/com/metis/domain/vo/GraphVo.java | 1 + .../java/com/metis/domain/vo/NodeDataVo.java | 6 +++ .../main/java/com/metis/domain/vo/NodeVo.java | 1 + .../metis/runner/impl/StartNodeRunner.java | 26 ++++++++++++ 20 files changed, 254 insertions(+), 9 deletions(-) diff --git a/metis-starter/src/main/java/com/metis/domain/bo/AppBO.java b/metis-starter/src/main/java/com/metis/domain/bo/AppBO.java index d944339..f05e012 100644 --- a/metis-starter/src/main/java/com/metis/domain/bo/AppBO.java +++ b/metis-starter/src/main/java/com/metis/domain/bo/AppBO.java @@ -1,19 +1,26 @@ package com.metis.domain.bo; import com.metis.enums.YesOrNoEnum; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data +@Schema(description = "应用") public class AppBO { + @Schema(description = "应用id") private Long appId; + @Schema(description = "应用名称") private String name; + @Schema(description = "应用描述") private String description; + @Schema(description = "画布") private GraphBO graph; + @Schema(description = "是否默认使用") private YesOrNoEnum defaultUse; } diff --git a/metis-starter/src/main/java/com/metis/domain/bo/BuildApp.java b/metis-starter/src/main/java/com/metis/domain/bo/BuildApp.java index 28d6540..0946bfc 100644 --- a/metis-starter/src/main/java/com/metis/domain/bo/BuildApp.java +++ b/metis-starter/src/main/java/com/metis/domain/bo/BuildApp.java @@ -1,6 +1,7 @@ package com.metis.domain.bo; import com.metis.domain.entity.base.Graph; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -11,24 +12,32 @@ import lombok.Data; @Builder public final class BuildApp { + /** + * 应用id + */ + @Schema(description = "应用id") private Long appId; /** * 用户id */ + @Schema(description = "用户id") private Long userId; /** * 名字 */ @NotBlank(message = "流程名称不能为空") + @Schema(description = "流程名称") private String name; - @NotNull(message = "流程模型不能为空") @Valid + @NotNull(message = "流程模型不能为空") + @Schema(description = "流程模型") private Graph graph; /** * 描述 */ + @Schema(description = "流程描述") private String description; } diff --git a/metis-starter/src/main/java/com/metis/domain/bo/CreateApp.java b/metis-starter/src/main/java/com/metis/domain/bo/CreateApp.java index a8a9c1a..604eea9 100644 --- a/metis-starter/src/main/java/com/metis/domain/bo/CreateApp.java +++ b/metis-starter/src/main/java/com/metis/domain/bo/CreateApp.java @@ -1,6 +1,7 @@ package com.metis.domain.bo; import com.metis.domain.entity.base.Graph; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -13,20 +14,24 @@ public class CreateApp { /** * 用户id */ + @Schema(description = "用户id") private Long userId; /** * 名字 */ @NotBlank(message = "流程名称不能为空") + @Schema(description = "流程名称") private String name; @NotNull(message = "流程模型不能为空") @Valid + @Schema(description = "流程模型") private Graph graph; /** * 描述 */ + @Schema(description = "流程描述") private String description; } diff --git a/metis-starter/src/main/java/com/metis/domain/bo/EdgeBO.java b/metis-starter/src/main/java/com/metis/domain/bo/EdgeBO.java index 0de8c4b..8c05ceb 100644 --- a/metis-starter/src/main/java/com/metis/domain/bo/EdgeBO.java +++ b/metis-starter/src/main/java/com/metis/domain/bo/EdgeBO.java @@ -1,6 +1,7 @@ package com.metis.domain.bo; import com.metis.enums.EdgeType; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -50,17 +51,56 @@ public class EdgeBO { /** * 边是否动画true/false */ + @Schema(description = "边是否动画true/false") private Boolean animated; /** * 开始标志 */ + @Schema(description = "开始标志") private String markerStart; /** * 结束标记 */ + @Schema(description = "结束标记") private String markerEnd; + /** + * 边是否可选中true,false + */ + @Schema(description = "边是否可选中true,false") + private Boolean selectable; + /** + * 边是否可更新true,false(更改它们的源/目标位置。) + */ + @Schema(description = "边是否可更新true,false(更改它们的源/目标位置。)") + private Boolean updatable; + + /** + * 边是否可以删除true,false + */ + @Schema(description = "边是否可以删除true,false") + private Boolean deletable; + /** + * 源位置x坐标 + */ + @Schema(description = "源位置x坐标") + private Float sourceX; + /** + * 源位置y坐标 + */ + @Schema(description = "源位置y坐标") + private Float sourceY; + /** + * 目标位置x坐标 + */ + @Schema(description = "目标位置x坐标") + private Float targetX; + /** + * 目标位置y坐标 + */ + @Schema(description = "目标位置y坐标") + private Float targetY; } diff --git a/metis-starter/src/main/java/com/metis/domain/bo/GraphBO.java b/metis-starter/src/main/java/com/metis/domain/bo/GraphBO.java index a5b51f5..e03cccc 100644 --- a/metis-starter/src/main/java/com/metis/domain/bo/GraphBO.java +++ b/metis-starter/src/main/java/com/metis/domain/bo/GraphBO.java @@ -1,5 +1,6 @@ package com.metis.domain.bo; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import lombok.Data; @@ -7,6 +8,7 @@ import lombok.Data; import java.util.List; @Data +@Schema(description = "画布") public class GraphBO { /** @@ -14,6 +16,7 @@ public class GraphBO { */ @Valid @NotEmpty(message = "连线不能为空") + @Schema(description = "连线") private List edges; /** @@ -21,22 +24,26 @@ public class GraphBO { */ @Valid @NotEmpty(message = "节点不能为空") + @Schema(description = "节点") private List nodes; /** * 位置 */ + @Schema(description = "位置") private List position; /** * 变焦 */ + @Schema(description = "变焦") private Double zoom; /** * 视窗 */ + @Schema(description = "视窗") private ViewportBo viewport; diff --git a/metis-starter/src/main/java/com/metis/domain/bo/HandleBO.java b/metis-starter/src/main/java/com/metis/domain/bo/HandleBO.java index 510557d..adb5699 100644 --- a/metis-starter/src/main/java/com/metis/domain/bo/HandleBO.java +++ b/metis-starter/src/main/java/com/metis/domain/bo/HandleBO.java @@ -2,6 +2,7 @@ package com.metis.domain.bo; import com.metis.enums.HandleType; import com.metis.enums.PositionType; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -14,23 +15,27 @@ public class HandleBO { * 句柄id */ @NotNull(message = "句柄id不能为空") + @Schema(description = "句柄id") private Long id; /** * 句柄类型 */ @NotNull(message = "句柄类型不能为空") + @Schema(description = "句柄类型") private HandleType type; /** * 句柄位置 */ @NotNull(message = "句柄位置不能为空") + @Schema(description = "句柄位置") private PositionType position; /** * 是否可以连接 */ @NotNull(message = "是否可以连接不能为空") + @Schema(description = "是否可以连接") private Boolean connectable; } diff --git a/metis-starter/src/main/java/com/metis/domain/bo/NodeBO.java b/metis-starter/src/main/java/com/metis/domain/bo/NodeBO.java index 9bab140..e7c2670 100644 --- a/metis-starter/src/main/java/com/metis/domain/bo/NodeBO.java +++ b/metis-starter/src/main/java/com/metis/domain/bo/NodeBO.java @@ -1,6 +1,7 @@ package com.metis.domain.bo; import com.metis.enums.NodeType; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -12,17 +13,20 @@ public class NodeBO { * id */ @NotNull(message = "节点id不能为空") + @Schema(description = "节点id") private Long id; /** * 类型 */ @NotNull(message = "节点类型不能为空") + @Schema(description = "节点类型") private NodeType type; /** * 自定义类型 */ + @Schema(description = "自定义类型") private String customType; /** @@ -30,6 +34,7 @@ public class NodeBO { */ @Valid @NotNull(message = "节点位置不能为空") + @Schema(description = "节点位置") private PositionBO position; /** @@ -37,23 +42,25 @@ public class NodeBO { */ @Valid @NotNull(message = "节点业务数据不能为空") + @Schema(description = "节点业务数据") private NodeDataBO data; /** * 宽度 */ -// @NotNull(message = "节点宽度不能为空") + @Schema(description = "节点宽度") private Integer width; /** * 高度 */ -// @NotNull(message = "节点高度不能为空") + @Schema(description = "节点高度") private Integer height; /** * 节点是否选中 */ + @Schema(description = "节点是否选中") private Boolean selected; diff --git a/metis-starter/src/main/java/com/metis/domain/bo/NodeDataBO.java b/metis-starter/src/main/java/com/metis/domain/bo/NodeDataBO.java index 04e0c82..390bd8c 100644 --- a/metis-starter/src/main/java/com/metis/domain/bo/NodeDataBO.java +++ b/metis-starter/src/main/java/com/metis/domain/bo/NodeDataBO.java @@ -23,6 +23,11 @@ public class NodeDataBO { */ private String icon; + /** + * 描述 + */ + private String description; + /** * 工具栏位置 */ diff --git a/metis-starter/src/main/java/com/metis/domain/bo/PositionBO.java b/metis-starter/src/main/java/com/metis/domain/bo/PositionBO.java index 00f0b50..1e34e58 100644 --- a/metis-starter/src/main/java/com/metis/domain/bo/PositionBO.java +++ b/metis-starter/src/main/java/com/metis/domain/bo/PositionBO.java @@ -1,19 +1,23 @@ package com.metis.domain.bo; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import lombok.Data; @Data +@Schema(description = "节点位置") public class PositionBO { /** * x坐标 */ @NotNull(message = "x坐标不能为空") + @Schema(description = "x坐标") private Double x; /** * y坐标 */ + @Schema(description = "y坐标") @NotNull(message = "y坐标不能为空") private Double y; diff --git a/metis-starter/src/main/java/com/metis/domain/bo/UpdateApp.java b/metis-starter/src/main/java/com/metis/domain/bo/UpdateApp.java index e4c3238..3420484 100644 --- a/metis-starter/src/main/java/com/metis/domain/bo/UpdateApp.java +++ b/metis-starter/src/main/java/com/metis/domain/bo/UpdateApp.java @@ -2,6 +2,7 @@ package com.metis.domain.bo; import com.metis.enums.YesOrNoEnum; import com.metis.domain.entity.base.Graph; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; @@ -15,22 +16,30 @@ public class UpdateApp { /** * id */ + @Schema(description = "id") private Long appId; /** * 名字 */ @NotBlank(message = "流程名称不能为空") + @Schema(description = "名字") private String name; @NotNull(message = "流程模型不能为空") @Valid + @Schema(description = "流程模型") private Graph graph; /** * 描述 */ + @Schema(description = "描述") private String description; + /** + * 是否默认使用 + */ + @Schema(description = "是否默认使用") private YesOrNoEnum defaultUse; } diff --git a/metis-starter/src/main/java/com/metis/domain/bo/ViewportBo.java b/metis-starter/src/main/java/com/metis/domain/bo/ViewportBo.java index 7209088..7a40002 100644 --- a/metis-starter/src/main/java/com/metis/domain/bo/ViewportBo.java +++ b/metis-starter/src/main/java/com/metis/domain/bo/ViewportBo.java @@ -1,10 +1,18 @@ package com.metis.domain.bo; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data +@Schema(description = "视窗") public class ViewportBo { + + @Schema(description = "x坐标") private Double x; + + @Schema(description = "y坐标") private Double y; + + @Schema(description = "变焦") private Double zoom; } diff --git a/metis-starter/src/main/java/com/metis/domain/context/RunningContext.java b/metis-starter/src/main/java/com/metis/domain/context/RunningContext.java index c2d1d68..2b61a3a 100644 --- a/metis-starter/src/main/java/com/metis/domain/context/RunningContext.java +++ b/metis-starter/src/main/java/com/metis/domain/context/RunningContext.java @@ -1,5 +1,7 @@ package com.metis.domain.context; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson2.JSONObject; import com.metis.runner.FlowRunningContext; import lombok.Builder; @@ -13,6 +15,8 @@ import java.util.Set; @Builder public class RunningContext { + private final static String SYS_PREFIX = "sys."; + /** * 系统数据 */ @@ -44,11 +48,39 @@ public class RunningContext { this.nodeRunningContext.put(nodeId, nodeRunningContext); } + /** + * 获取运行上下文 + * + * @param nodeId 节点id + * @return {@link JSONObject } + */ public JSONObject getRunningContext(Long nodeId) { return this.nodeRunningContext.get(nodeId); } + /** + * 获得价值 不满足条件, 则返回null, 需要业务自行判断 + * + * @param nodeId 节点id + * @param key 关键 + * @return {@link Object } + */ + public Object getValue(Long nodeId, String key) { + if (ObjectUtil.isNull(nodeId)) { + return null; + } + if (StrUtil.isBlank(key)) { + return null; + } + JSONObject runningContext = getRunningContext(nodeId); + if (ObjectUtil.isNull(runningContext)) { + return null; + } + return runningContext.get(key); + } + + /** * 构建上下文 * @@ -64,5 +96,4 @@ public class RunningContext { } - } diff --git a/metis-starter/src/main/java/com/metis/domain/context/SysContext.java b/metis-starter/src/main/java/com/metis/domain/context/SysContext.java index a2327e9..83da184 100644 --- a/metis-starter/src/main/java/com/metis/domain/context/SysContext.java +++ b/metis-starter/src/main/java/com/metis/domain/context/SysContext.java @@ -48,4 +48,5 @@ public class SysContext { * 实例id */ private Long instanceId; + } diff --git a/metis-starter/src/main/java/com/metis/domain/entity/base/Edge.java b/metis-starter/src/main/java/com/metis/domain/entity/base/Edge.java index d389fec..f1afa17 100644 --- a/metis-starter/src/main/java/com/metis/domain/entity/base/Edge.java +++ b/metis-starter/src/main/java/com/metis/domain/entity/base/Edge.java @@ -13,17 +13,17 @@ public class Edge { @NotNull(message = "唯一标识符不能为空") private String id; - /** - * 标签 - */ - private String label; - /** * 节点类型 */ @NotNull(message = "线类型不能为空") private EdgeType type; + /** + * 标签 + */ + private String label; + /** * 源节点ID,对应节点id */ @@ -62,5 +62,36 @@ public class Edge { */ private String markerEnd; + /** + * 边是否可选中true,false + */ + private Boolean selectable; + + /** + * 边是否可更新true,false(更改它们的源/目标位置。) + */ + private Boolean updatable; + + /** + * 边是否可以删除true,false + */ + private Boolean deletable; + /** + * 源位置x坐标 + */ + private Float sourceX; + /** + * 源位置y坐标 + */ + private Float sourceY; + /** + * 目标位置x坐标 + */ + private Float targetX; + /** + * 目标位置y坐标 + */ + private Float targetY; + } diff --git a/metis-starter/src/main/java/com/metis/domain/entity/base/NodeData.java b/metis-starter/src/main/java/com/metis/domain/entity/base/NodeData.java index 9aa53f7..9b3a8f5 100644 --- a/metis-starter/src/main/java/com/metis/domain/entity/base/NodeData.java +++ b/metis-starter/src/main/java/com/metis/domain/entity/base/NodeData.java @@ -23,6 +23,11 @@ public class NodeData { */ private String icon; + /** + * 描述 + */ + private String description; + /** * 工具栏位置 */ diff --git a/metis-starter/src/main/java/com/metis/domain/vo/EdgeVo.java b/metis-starter/src/main/java/com/metis/domain/vo/EdgeVo.java index f31cba0..5438c56 100644 --- a/metis-starter/src/main/java/com/metis/domain/vo/EdgeVo.java +++ b/metis-starter/src/main/java/com/metis/domain/vo/EdgeVo.java @@ -67,4 +67,41 @@ public class EdgeVo { @Schema(description = "结束标记") private String markerEnd; + /** + * 边是否可选中true,false + */ + @Schema(description = "边是否可选中true,false") + private Boolean selectable; + + /** + * 边是否可更新true,false(更改它们的源/目标位置。) + */ + @Schema(description = "边是否可更新true,false(更改它们的源/目标位置。)") + private Boolean updatable; + + /** + * 边是否可以删除true,false + */ + @Schema(description = "边是否可以删除true,false") + private Boolean deletable; + /** + * 源位置x坐标 + */ + @Schema(description = "源位置x坐标") + private Float sourceX; + /** + * 源位置y坐标 + */ + @Schema(description = "源位置y坐标") + private Float sourceY; + /** + * 目标位置x坐标 + */ + @Schema(description = "目标位置x坐标") + private Float targetX; + /** + * 目标位置y坐标 + */ + @Schema(description = "目标位置y坐标") + private Float targetY; } diff --git a/metis-starter/src/main/java/com/metis/domain/vo/GraphVo.java b/metis-starter/src/main/java/com/metis/domain/vo/GraphVo.java index b50ef86..22d243f 100644 --- a/metis-starter/src/main/java/com/metis/domain/vo/GraphVo.java +++ b/metis-starter/src/main/java/com/metis/domain/vo/GraphVo.java @@ -8,6 +8,7 @@ import java.util.List; @Data +@Schema(description = "画布") public class GraphVo { /** diff --git a/metis-starter/src/main/java/com/metis/domain/vo/NodeDataVo.java b/metis-starter/src/main/java/com/metis/domain/vo/NodeDataVo.java index e133f32..e60d348 100644 --- a/metis-starter/src/main/java/com/metis/domain/vo/NodeDataVo.java +++ b/metis-starter/src/main/java/com/metis/domain/vo/NodeDataVo.java @@ -23,6 +23,12 @@ public class NodeDataVo { @Schema(description = "图标") private String icon; + /** + * 描述 + */ + @Schema(description = "描述") + private String description; + /** * 工具栏位置 */ diff --git a/metis-starter/src/main/java/com/metis/domain/vo/NodeVo.java b/metis-starter/src/main/java/com/metis/domain/vo/NodeVo.java index d92f76e..b9b41ac 100644 --- a/metis-starter/src/main/java/com/metis/domain/vo/NodeVo.java +++ b/metis-starter/src/main/java/com/metis/domain/vo/NodeVo.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @Data +@Schema(description = "节点") public class NodeVo { /** diff --git a/metis-starter/src/main/java/com/metis/runner/impl/StartNodeRunner.java b/metis-starter/src/main/java/com/metis/runner/impl/StartNodeRunner.java index 7019f92..a387f62 100644 --- a/metis-starter/src/main/java/com/metis/runner/impl/StartNodeRunner.java +++ b/metis-starter/src/main/java/com/metis/runner/impl/StartNodeRunner.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson2.JSONObject; import com.metis.domain.context.RunningContext; import com.metis.domain.context.RunningResult; +import com.metis.domain.context.SysContext; import com.metis.domain.entity.base.Edge; import com.metis.domain.entity.base.Node; import com.metis.domain.entity.base.NodeVariable; @@ -37,6 +38,10 @@ public class StartNodeRunner implements NodeRunner { // 获取用户自定义参数 JSONObject custom = context.getCustom(); JSONObject contextNodeValue = new JSONObject(); + // 获取到系统上下文, 并将系统上下文放入到start的运行结果中, 用于后续调用 + JSONObject sysContext = getSysContext(context); + contextNodeValue.putAll(sysContext); + for (NodeVariable variable : variables) { Object value = variable.getValue(custom); contextNodeValue.put(variable.getVariable(), value); @@ -44,6 +49,27 @@ public class StartNodeRunner implements NodeRunner { return RunningResult.buildResult(contextNodeValue); } + /** + * 获取系统上下文 + * + * @param context 上下文 + * @return {@link JSONObject } + */ + private JSONObject getSysContext(RunningContext context) { + JSONObject sys = new JSONObject(); + // 系统参数全部以sys.开头 + SysContext sysContext = context.getSys(); + sys.put("sys.userId", sysContext.getUserId()); + sys.put("sys.appId", sysContext.getAppId()); + sys.put("sys.workflowId", sysContext.getWorkflowId()); + sys.put("sys.instanceId", sysContext.getInstanceId()); + sys.put("sys.conversationId", sysContext.getConversationId()); + sys.put("sys.dialogueCount", sysContext.getDialogueCount()); + sys.put("sys.files", sysContext.getFiles()); + sys.put("sys.query", sysContext.getQuery()); + return sys; + } + @Override public NodeType getType() {