diff --git a/backend/app/pom.xml b/backend/app/pom.xml
index 49bf902068..63b693b82d 100644
--- a/backend/app/pom.xml
+++ b/backend/app/pom.xml
@@ -46,7 +46,7 @@
io.metersphere
- metersphere-test-track
+ metersphere-functional-test
${revision}
diff --git a/backend/app/src/main/resources/logback-spring.xml b/backend/app/src/main/resources/logback-spring.xml
index c98f1d4a59..4c75905c79 100644
--- a/backend/app/src/main/resources/logback-spring.xml
+++ b/backend/app/src/main/resources/logback-spring.xml
@@ -269,15 +269,15 @@
-
+
INFO
- ${logging.file.path}/test-track.log
+ ${logging.file.path}/functional-test.log
- ${logging.file.path}/history/test-track.%d{yyyyMMdd}-%i.log
+ ${logging.file.path}/history/functional-test.%d{yyyyMMdd}-%i.log
${logger.max.history:-30}
50MB
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReview.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReview.java
new file mode 100644
index 0000000000..41bad9da4e
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReview.java
@@ -0,0 +1,72 @@
+package io.metersphere.functional.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@ApiModel(value = "用例评审")
+@TableName("case_review")
+@Data
+public class CaseReview implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId
+ @NotBlank(message = "{case_review.id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "ID", required = true, allowableValues = "range[1, 50]")
+ private String id;
+
+ @Size(min = 1, max = 200, message = "{case_review.name.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review.name.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "名称", required = true, allowableValues = "range[1, 200]")
+ private String name;
+
+ @Size(min = 1, max = 64, message = "{case_review.status.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review.status.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "评审状态:未开始/进行中/已完成/已结束/已归档", required = true, allowableValues = "range[1, 64]")
+ private String status;
+
+
+ @ApiModelProperty(name = "创建时间", required = true, dataType = "Long")
+ private Long createTime;
+
+
+ @ApiModelProperty(name = "更新时间", required = true, dataType = "Long")
+ private Long updateTime;
+
+
+ @ApiModelProperty(name = "评审结束时间", required = true, dataType = "Long")
+ private Long endTime;
+
+
+ @ApiModelProperty(name = "描述", required = false)
+ private String description;
+
+ @Size(min = 1, max = 50, message = "{case_review.project_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review.project_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "项目ID", required = true, allowableValues = "range[1, 50]")
+ private String projectId;
+
+
+ @ApiModelProperty(name = "标签", required = false, allowableValues = "range[1, 1000]")
+ private String tags;
+
+ @Size(min = 1, max = 50, message = "{case_review.create_user.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review.create_user.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "创建人", required = true, allowableValues = "range[1, 50]")
+ private String createUser;
+
+ @Size(min = 1, max = 64, message = "{case_review.review_pass_rule.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review.review_pass_rule.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "评审规则:单人通过/全部通过", required = true, allowableValues = "range[1, 64]")
+ private String reviewPassRule;
+
+
+}
\ No newline at end of file
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReviewFollow.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReviewFollow.java
new file mode 100644
index 0000000000..dc7c85c2f4
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReviewFollow.java
@@ -0,0 +1,32 @@
+package io.metersphere.functional.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@ApiModel(value = "用例评审关注人")
+@TableName("case_review_follow")
+@Data
+public class CaseReviewFollow implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId
+ @NotBlank(message = "{case_review_follow.review_id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "评审ID", required = true, allowableValues = "range[1, 50]")
+ private String reviewId;
+
+
+ @NotBlank(message = "{case_review_follow.follow_id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "关注人", required = true, allowableValues = "range[1, 50]")
+ private String followId;
+
+
+}
\ No newline at end of file
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReviewFunctionalCase.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReviewFunctionalCase.java
new file mode 100644
index 0000000000..c621b089dc
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReviewFunctionalCase.java
@@ -0,0 +1,64 @@
+package io.metersphere.functional.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@ApiModel(value = "用例评审和功能用例的中间表")
+@TableName("case_review_functional_case")
+@Data
+public class CaseReviewFunctionalCase implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId
+ @NotBlank(message = "{case_review_functional_case.id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "ID", required = true, allowableValues = "range[1, 50]")
+ private String id;
+
+ @Size(min = 1, max = 50, message = "{case_review_functional_case.review_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review_functional_case.review_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "评审ID", required = true, allowableValues = "range[1, 50]")
+ private String reviewId;
+
+ @Size(min = 1, max = 50, message = "{case_review_functional_case.case_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review_functional_case.case_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "用例ID", required = true, allowableValues = "range[1, 50]")
+ private String caseId;
+
+ @Size(min = 1, max = 64, message = "{case_review_functional_case.status.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review_functional_case.status.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "评审状态:进行中/通过/不通过/重新提审", required = true, allowableValues = "range[1, 64]")
+ private String status;
+
+
+ @ApiModelProperty(name = "创建时间", required = true, dataType = "Long")
+ private Long createTime;
+
+
+ @ApiModelProperty(name = "更新时间", required = true, dataType = "Long")
+ private Long updateTime;
+
+ @Size(min = 1, max = 50, message = "{case_review_functional_case.create_user.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review_functional_case.create_user.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "创建人", required = true, allowableValues = "range[1, 50]")
+ private String createUser;
+
+
+ @ApiModelProperty(name = "自定义排序,间隔5000", required = true, dataType = "Long")
+ private Long pos;
+
+ @Size(min = 1, max = 1, message = "{case_review_functional_case.deleted.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review_functional_case.deleted.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "关联的用例是否放入回收站", required = true, allowableValues = "range[1, 1]")
+ private Boolean deleted;
+
+
+}
\ No newline at end of file
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReviewFunctionalCaseUser.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReviewFunctionalCaseUser.java
new file mode 100644
index 0000000000..dd2b6a4d9f
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReviewFunctionalCaseUser.java
@@ -0,0 +1,37 @@
+package io.metersphere.functional.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@ApiModel(value = "功能用例评审和评审人的中间表")
+@TableName("case_review_functional_case_user")
+@Data
+public class CaseReviewFunctionalCaseUser implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @Size(min = 1, max = 50, message = "{case_review_functional_case_user.case_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review_functional_case_user.case_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "功能用例和评审中间表的ID", required = true, allowableValues = "range[1, 50]")
+ private String caseId;
+
+ @Size(min = 1, max = 50, message = "{case_review_functional_case_user.review_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review_functional_case_user.review_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "评审ID", required = true, allowableValues = "range[1, 50]")
+ private String reviewId;
+
+ @Size(min = 1, max = 50, message = "{case_review_functional_case_user.user_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{case_review_functional_case_user.user_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "评审人ID", required = true, allowableValues = "range[1, 50]")
+ private String userId;
+
+
+}
\ No newline at end of file
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReviewUser.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReviewUser.java
new file mode 100644
index 0000000000..0eff6fb2c2
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CaseReviewUser.java
@@ -0,0 +1,29 @@
+package io.metersphere.functional.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import java.io.Serializable;
+
+@ApiModel(value = "评审和评审人中间表")
+@TableName("case_review_user")
+@Data
+public class CaseReviewUser implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @NotBlank(message = "{case_review_user.review_id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "评审ID", required = true, allowableValues="range[1, 50]")
+ private String reviewId;
+
+ @NotBlank(message = "{case_review_user.user_id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "评审人ID", required = true, allowableValues="range[1, 50]")
+ private String userId;
+
+
+}
\ No newline at end of file
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CustomFieldTestCase.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CustomFieldTestCase.java
new file mode 100644
index 0000000000..7369f4c950
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/CustomFieldTestCase.java
@@ -0,0 +1,38 @@
+package io.metersphere.functional.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@ApiModel(value = "自定义字段功能用例关系")
+@TableName("custom_field_test_case")
+@Data
+public class CustomFieldTestCase implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @NotBlank(message = "{custom_field_test_case.resource_id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "资源ID", required = true, allowableValues = "range[1, 50]")
+ private String resourceId;
+
+ @NotBlank(message = "{custom_field_test_case.field_id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "字段ID", required = true, allowableValues = "range[1, 50]")
+ private String fieldId;
+
+
+ @ApiModelProperty(name = "字段值", required = false, allowableValues = "range[1, 1000]")
+ private String value;
+
+
+ @ApiModelProperty(name = "", required = false, allowableValues = "range[1, ]")
+ private String textValue;
+
+
+}
\ No newline at end of file
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCase.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCase.java
new file mode 100644
index 0000000000..8ebbf7c52a
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCase.java
@@ -0,0 +1,120 @@
+package io.metersphere.functional.domain;
+
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@ApiModel(value = "功能用例")
+@TableName("functional_case")
+@Data
+public class FunctionalCase implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+
+ @TableId
+ @NotBlank(message = "{functional_case.id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "ID", required = true, allowableValues = "range[1, 50]")
+ private String id;
+
+
+ @ApiModelProperty(name = "业务ID", required = true, dataType = "Integer")
+ private Integer num;
+
+ @Size(min = 1, max = 64, message = "{functional_case.custom_num.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.custom_num.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "自定义业务ID", required = true, allowableValues = "range[1, 64]")
+ private String customNum;
+
+ @Size(min = 1, max = 50, message = "{functional_case.module_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.module_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "模块ID", required = true, allowableValues = "range[1, 50]")
+ private String moduleId;
+
+ @Size(min = 1, max = 50, message = "{functional_case.project_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.project_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "项目ID", required = true, allowableValues = "range[1, 50]")
+ private String projectId;
+
+ @Size(min = 1, max = 255, message = "{functional_case.name.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.name.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "名称", required = true, allowableValues = "range[1, 255]")
+ private String name;
+
+ @Size(min = 1, max = 64, message = "{functional_case.review_status.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.review_status.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "评审状态:未开始/进行中/已完成/已结束", required = true, allowableValues = "range[1, 64]")
+ private String reviewStatus;
+
+
+ @ApiModelProperty(name = "标签(JSON)", required = false, allowableValues = "range[1, 1000]")
+ private String tags;
+
+ @Size(min = 1, max = 64, message = "{functional_case.step_model.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.step_model.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "编辑模式:步骤模式/文本模式", required = true, allowableValues = "range[1, 64]")
+ private String stepModel;
+
+
+ @ApiModelProperty(name = "自定义排序,间隔5000", required = true, dataType = "Long")
+ private Long pos;
+
+ @Size(min = 1, max = 50, message = "{functional_case.version_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.version_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "版本ID", required = true, allowableValues = "range[1, 50]")
+ private String versionId;
+
+ @Size(min = 1, max = 50, message = "{functional_case.ref_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.ref_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "指向初始版本ID", required = true, allowableValues = "range[1, 50]")
+ private String refId;
+
+ @Size(min = 1, max = 64, message = "{functional_case.last_execute_result.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.last_execute_result.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "最近的执行结果:未执行/通过/失败/阻塞/跳过", required = true, allowableValues = "range[1, 64]")
+ private String lastExecuteResult;
+
+ @Size(min = 1, max = 1, message = "{functional_case.deleted.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.deleted.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "是否在回收站:0-否,1-是", required = true, allowableValues = "range[1, 1]")
+ private Boolean deleted;
+
+ @Size(min = 1, max = 1, message = "{functional_case.public_case.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.public_case.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "是否是公共用例:0-否,1-是", required = true, allowableValues = "range[1, 1]")
+ private Boolean publicCase;
+
+ @Size(min = 1, max = 1, message = "{functional_case.latest.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.latest.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "是否为最新版本:0-否,1-是", required = true, allowableValues = "range[1, 1]")
+ private Boolean latest;
+
+ @Size(min = 1, max = 100, message = "{functional_case.create_user.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case.create_user.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "创建人", required = true, allowableValues = "range[1, 100]")
+ private String createUser;
+
+
+ @ApiModelProperty(name = "删除人", required = false, allowableValues = "range[1, 64]")
+ private String deleteUser;
+
+
+ @ApiModelProperty(name = "创建时间", required = true, dataType = "Long")
+ private Long createTime;
+
+
+ @ApiModelProperty(name = "更新时间", required = true, dataType = "Long")
+ private Long updateTime;
+
+
+ @ApiModelProperty(name = "删除时间", required = false, dataType = "Long")
+ private Long deleteTime;
+}
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseAttachment.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseAttachment.java
new file mode 100644
index 0000000000..900d21e6b1
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseAttachment.java
@@ -0,0 +1,29 @@
+package io.metersphere.functional.domain;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+@ApiModel(value = "功能用例和附件的中间表")
+@TableName("functional_case_attachment")
+@Data
+public class FunctionalCaseAttachment implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @NotBlank(message = "{functional_case_attachment.functional_case_id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "功能用例ID", required = true, allowableValues = "range[1, 50]")
+ private String functionalCaseId;
+
+ @NotBlank(message = "{functional_case_attachment.file_id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "文件的ID", required = true, allowableValues = "range[1, 50]")
+ private String fileId;
+
+}
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseBlob.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseBlob.java
new file mode 100644
index 0000000000..3d46733f00
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseBlob.java
@@ -0,0 +1,43 @@
+package io.metersphere.functional.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@ApiModel(value = "功能用例")
+@TableName("functional_case_blob")
+@Data
+public class FunctionalCaseBlob implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId
+ @NotBlank(message = "{functional_case_blob.functional_case_id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "功能用例ID", required = true, allowableValues = "range[1, 50]")
+ private String functionalCaseId;
+
+
+ @ApiModelProperty(name = "用例步骤(JSON),step_model 为 0 时启用", required = false)
+ private String steps;
+
+
+ @ApiModelProperty(name = "步骤描述,step_model 为 1 时启用", required = false)
+ private String stepDescription;
+
+
+ @ApiModelProperty(name = "预期结果,step_model 为 1 时启用", required = false)
+ private String expectedResult;
+
+
+ @ApiModelProperty(name = "前置条件", required = false)
+ private String prerequisite;
+
+
+ @ApiModelProperty(name = "备注", required = false)
+ private String description;
+}
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseComment.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseComment.java
new file mode 100644
index 0000000000..1a2af46a6e
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseComment.java
@@ -0,0 +1,62 @@
+package io.metersphere.functional.domain;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+@ApiModel(value = "功能用例评论")
+@TableName("functional_case_comment")
+@Data
+public class FunctionalCaseComment implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId
+ @NotBlank(message = "{functional_case_comment.id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "ID", required = true, allowableValues = "range[1, 50]")
+ private String id;
+
+ @Size(min = 1, max = 50, message = "{functional_case_comment.case_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_comment.case_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "功能用例ID", required = true, allowableValues = "range[1, 50]")
+ private String caseId;
+
+ @Size(min = 1, max = 50, message = "{functional_case_comment.create_user.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_comment.create_user.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "评论人", required = true, allowableValues = "range[1, 50]")
+ private String createUser;
+
+
+ @ApiModelProperty(name = "评论时添加的状态:通过/不通过/重新提审/通过标准变更标记/强制通过标记/强制不通过标记/状态变更标记", required = false, allowableValues = "range[1, 64]")
+ private String status;
+
+ @Size(min = 1, max = 64, message = "{functional_case_comment.type.length_range}", groups = {Created.class, Updated.class})
+
+ @NotBlank(message = "{functional_case_comment.type.not_blank}", groups = {Created.class})
+
+ @ApiModelProperty(name = "评论类型:用例评论/测试计划用例评论/评审用例评论", required = true, allowableValues = "range[1, 64]")
+ private String type;
+
+
+ @ApiModelProperty(name = "当前评审所属的测试计划ID或评审ID", required = false, allowableValues = "range[1, 50]")
+ private String belongId;
+
+
+ @ApiModelProperty(name = "创建时间", required = true, dataType = "Long")
+ private Long createTime;
+
+
+ @ApiModelProperty(name = "更新时间", required = true, dataType = "Long")
+ private Long updateTime;
+
+
+ @ApiModelProperty(name = "描述", required = false)
+ private String description;
+}
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseFollow.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseFollow.java
new file mode 100644
index 0000000000..3ac8825887
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseFollow.java
@@ -0,0 +1,28 @@
+package io.metersphere.functional.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@ApiModel(value = "功能用例和关注人的中间表")
+@TableName("functional_case_follow")
+@Data
+public class FunctionalCaseFollow implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @NotBlank(message = "{functional_case_follow.case_id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "功能用例ID", required = true, allowableValues = "range[1, 50]")
+ private String caseId;
+
+ @NotBlank(message = "{functional_case_follow.follow_id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "关注人ID", required = true, allowableValues = "range[1, 50]")
+ private String followId;
+
+
+}
\ No newline at end of file
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseModule.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseModule.java
new file mode 100644
index 0000000000..d15f1be841
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseModule.java
@@ -0,0 +1,58 @@
+package io.metersphere.functional.domain;
+
+import java.io.Serializable;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+@ApiModel(value = "功能用例模块")
+@TableName("functional_case_module")
+@Data
+public class FunctionalCaseModule implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId
+ @NotBlank(message = "{functional_case_module.id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "ID", required = true, allowableValues = "range[1, 50]")
+ private String id;
+
+ @Size(min = 1, max = 50, message = "{functional_case_module.project_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_module.project_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "项目ID", required = true, allowableValues = "range[1, 50]")
+ private String projectId;
+
+ @Size(min = 1, max = 100, message = "{functional_case_module.name.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_module.name.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "名称", required = true, allowableValues = "range[1, 100]")
+ private String name;
+
+ @ApiModelProperty(name = "父节点ID", required = false, allowableValues = "range[1, 50]")
+ private String parentId;
+
+
+ @ApiModelProperty(name = "节点的层级", required = true, dataType = "Integer")
+ private Integer level;
+
+ @ApiModelProperty(name = "创建时间", required = true, dataType = "Long")
+ private Long createTime;
+
+ @ApiModelProperty(name = "更新时间", required = true, dataType = "Long")
+ private Long updateTime;
+
+ @Size(min = 1, max = 10, message = "{functional_case_module.pos.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_module.pos.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "同一节点下的顺序", required = true, dataType = "Long")
+ private Long pos;
+
+ @Size(min = 1, max = 50, message = "{functional_case_module.create_user.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_module.create_user.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "创建人", required = true, allowableValues = "range[1, 50]")
+ private String createUser;
+}
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseRelationshipEdge.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseRelationshipEdge.java
new file mode 100644
index 0000000000..762fa7397f
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseRelationshipEdge.java
@@ -0,0 +1,54 @@
+package io.metersphere.functional.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@ApiModel(value = "功能用例的前后置关系")
+@TableName("functional_case_relationship_edge")
+@Data
+public class FunctionalCaseRelationshipEdge implements Serializable {
+ private static final long serialVersionUID = 1L;
+ @TableId
+ @NotBlank(message = "{functional_case_relationship_edge.id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "ID", required = true, allowableValues = "range[1, 50]")
+ private String id;
+
+ @Size(min = 1, max = 50, message = "{functional_case_relationship_edge.source_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_relationship_edge.source_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "源节点的ID", required = true, allowableValues = "range[1, 50]")
+ private String sourceId;
+
+ @Size(min = 1, max = 50, message = "{functional_case_relationship_edge.target_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_relationship_edge.target_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "目标节点的ID", required = true, allowableValues = "range[1, 50]")
+ private String targetId;
+
+ @Size(min = 1, max = 50, message = "{functional_case_relationship_edge.graph_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_relationship_edge.graph_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "所属关系图的ID", required = true, allowableValues = "range[1, 50]")
+ private String graphId;
+
+ @Size(min = 1, max = 50, message = "{functional_case_relationship_edge.create_user.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_relationship_edge.create_user.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "创建人", required = true, allowableValues = "range[1, 50]")
+ private String createUser;
+
+
+ @ApiModelProperty(name = "更新时间", required = true, dataType = "Long")
+ private Long updateTime;
+
+
+ @ApiModelProperty(name = "创建时间", required = true, dataType = "Long")
+ private Long createTime;
+
+
+}
\ No newline at end of file
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseTest.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseTest.java
new file mode 100644
index 0000000000..e9fc47a431
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/FunctionalCaseTest.java
@@ -0,0 +1,50 @@
+package io.metersphere.functional.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@ApiModel(value = "功能用例和其他用例的中间表")
+@TableName("functional_case_test")
+@Data
+public class FunctionalCaseTest implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ @TableId
+ @NotBlank(message = "{functional_case_test.id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "ID", required = true, allowableValues = "range[1, 50]")
+ private String id;
+
+ @Size(min = 1, max = 50, message = "{functional_case_test.functional_case_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_test.functional_case_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "功能用例ID", required = true, allowableValues = "range[1, 50]")
+ private String functionalCaseId;
+
+ @Size(min = 1, max = 50, message = "{functional_case_test.test_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_test.test_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "其他类型用例ID", required = true, allowableValues = "range[1, 50]")
+ private String testId;
+
+ @Size(min = 1, max = 64, message = "{functional_case_test.test_type.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{functional_case_test.test_type.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "用例类型:接口用例/场景用例/性能用例/UI用例", required = true, allowableValues = "range[1, 64]")
+ private String testType;
+
+
+ @ApiModelProperty(name = "创建时间", required = true, dataType = "Long")
+ private Long createTime;
+
+
+ @ApiModelProperty(name = "更新时间", required = true, dataType = "Long")
+ private Long updateTime;
+
+
+}
\ No newline at end of file
diff --git a/backend/framework/domain/src/main/java/io/metersphere/functional/domain/MinderExtraNode.java b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/MinderExtraNode.java
new file mode 100644
index 0000000000..6fa307a797
--- /dev/null
+++ b/backend/framework/domain/src/main/java/io/metersphere/functional/domain/MinderExtraNode.java
@@ -0,0 +1,44 @@
+package io.metersphere.functional.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.metersphere.validation.groups.Created;
+import io.metersphere.validation.groups.Updated;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import java.io.Serializable;
+
+@ApiModel(value = "脑图临时节点")
+@TableName("minder_extra_node")
+@Data
+public class MinderExtraNode implements Serializable {
+ private static final long serialVersionUID = 1L;
+ @TableId
+ @NotBlank(message = "{minder_extra_node.id.not_blank}", groups = {Updated.class})
+ @ApiModelProperty(name = "ID", required = true, allowableValues="range[1, 50]")
+ private String id;
+
+ @Size(min = 1, max = 50, message = "{minder_extra_node.parent_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{minder_extra_node.parent_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "父节点的ID,即模块ID", required = true, allowableValues="range[1, 50]")
+ private String parentId;
+
+ @Size(min = 1, max = 50, message = "{minder_extra_node.group_id.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{minder_extra_node.group_id.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "项目ID,可扩展为其他资源ID", required = true, allowableValues="range[1, 50]")
+ private String groupId;
+
+ @Size(min = 1, max = 30, message = "{minder_extra_node.type.length_range}", groups = {Created.class, Updated.class})
+ @NotBlank(message = "{minder_extra_node.type.not_blank}", groups = {Created.class})
+ @ApiModelProperty(name = "类型,如:用例编辑脑图", required = true, allowableValues="range[1, 30]")
+ private String type;
+
+
+ @ApiModelProperty(name = "存储脑图节点额外信息", required = true, allowableValues="range[1, ]")
+ private String nodeData;
+
+
+}
\ No newline at end of file
diff --git a/backend/framework/sdk/src/main/resources/i18n/track.properties b/backend/framework/sdk/src/main/resources/i18n/functional.properties
similarity index 100%
rename from backend/framework/sdk/src/main/resources/i18n/track.properties
rename to backend/framework/sdk/src/main/resources/i18n/functional.properties
diff --git a/backend/framework/sdk/src/main/resources/i18n/functional_en_US.properties b/backend/framework/sdk/src/main/resources/i18n/functional_en_US.properties
new file mode 100644
index 0000000000..653c86b42b
--- /dev/null
+++ b/backend/framework/sdk/src/main/resources/i18n/functional_en_US.properties
@@ -0,0 +1,50 @@
+#module:FunctionalCase
+functional_case.id.not_blank=ID cannot be empty
+functional_case.num.not_blank=Business ID cannot be empty
+functional_case.custom_num.length_range=The length of the custom business ID must be between 1 and 64
+functional_case.custom_num.not_blank=Custom business ID cannot be empty
+functional_case.module_id.length_range=Module ID length must be between 1 and 50
+functional_case.module_id.not_blank=Module ID cannot be empty
+functional_case.project_id.length_range=The length of the project ID must be between 1 and 50
+functional_case.project_id.not_blank=Project ID cannot be empty
+functional_case.name.length_range=The name length must be between 1 and 255
+functional_case.name.not_blank=Name cannot be empty
+functional_case.review_status.length_range=The length of the review status must be between 1 and 64
+functional_case.review_status.not_blank=Review status cannot be empty
+functional_case.step_model.length_range=The length of the editing mode must be between 1 and 64
+functional_case.step_model.not_blank=Edit mode cannot be empty
+functional_case.version_id.length_range=Version ID length must be between 1 and 50
+functional_case.version_id.not_blank=Version ID cannot be empty
+functional_case.ref_id.length_range=Pointing to the initial version ID must be between 1 and 50
+functional_case.ref_id.not_blank=Pointing to the initial version ID cannot be empty
+functional_case.last_execute_result.length_range=The length of the most recent execution result must be between 1 and 64
+functional_case.last_execute_result.not_blank=The recent execution result cannot be empty
+functional_case.deleted.length_range=Whether the length of the recycle bin must be between 1 and 1
+functional_case.deleted.not_blank=Whether it is in the recycle bin cannot be empty
+functional_case.public_case.length_range=Whether it is a public use case, the length must be between 1 and 1
+functional_case.public_case.not_blank=whether it is a public use case cannot be empty
+functional_case.latest.length_range=Whether it is the latest version or not. The length must be between 1 and 1
+functional_case.latest.not_blank=whether it is the latest version cannot be empty
+functional_case.create_user.length_range=Creator length must be between 1 and 100
+functional_case.create_user.not_blank=Creator cannot be empty
+#module:FunctionalCaseBlob
+functional_case_blob.functional_case_id.not_blank=Function case ID cannot be empty
+#module:FunctionalCaseComment
+functional_case_comment.id.not_blank=ID cannot be empty
+functional_case_comment.case_id.length_range=The length of the function case ID must be between 1 and 50
+functional_case_comment.case_id.not_blank=Function case ID cannot be empty
+functional_case_comment.create_user.length_range=The length of the reviewer must be between 1 and 50
+functional_case_comment.create_user.not_blank=Reviewer cannot be empty
+functional_case_comment.type.length_range=Comment type length must be between 1 and 64
+functional_case_comment.type.not_blank=Comment type cannot be empty
+#module:FunctionalCaseModule
+functional_case_module.id.not_blank=ID cannot be empty
+functional_case_module.project_id.length_range=The length of the project ID must be between 1 and 50
+functional_case_module.project_id.not_blank=Project ID cannot be empty
+functional_case_module.name.length_range=The name length must be between 1 and 100
+functional_case_module.name.not_blank=Name cannot be empty
+functional_case_module.pos.length_range=The order length under the same node must be between 1 and 10
+functional_case_module.pos.not_blank=The order under the same node cannot be empty
+functional_case_module.create_user.length_range=Creator length must be between 1 and 50
+functional_case_module.create_user.not_blank=Creator cannot be empty
+
diff --git a/backend/framework/sdk/src/main/resources/i18n/functional_zh_CN.properties b/backend/framework/sdk/src/main/resources/i18n/functional_zh_CN.properties
new file mode 100644
index 0000000000..80cfd9284d
--- /dev/null
+++ b/backend/framework/sdk/src/main/resources/i18n/functional_zh_CN.properties
@@ -0,0 +1,49 @@
+#module:FunctionalCase
+functional_case.id.not_blank=ID不能为空
+functional_case.num.not_blank=业务ID不能为空
+functional_case.custom_num.length_range=自定义业务ID长度必须在1-64之间
+functional_case.custom_num.not_blank=自定义业务ID不能为空
+functional_case.module_id.length_range=模块ID长度必须在1-50之间
+functional_case.module_id.not_blank=模块ID不能为空
+functional_case.project_id.length_range=项目ID长度必须在1-50之间
+functional_case.project_id.not_blank=项目ID不能为空
+functional_case.name.length_range=名称长度必须在1-255之间
+functional_case.name.not_blank=名称不能为空
+functional_case.review_status.length_range=评审状态长度必须在1-64之间
+functional_case.review_status.not_blank=评审状态不能为空
+functional_case.step_model.length_range=编辑模式长度必须在1-64之间
+functional_case.step_model.not_blank=编辑模式不能为空
+functional_case.version_id.length_range=版本ID长度必须在1-50之间
+functional_case.version_id.not_blank=版本ID不能为空
+functional_case.ref_id.length_range=指向初始版本ID必须在1-50之间
+functional_case.ref_id.not_blank=指向初始版本ID不能为空
+functional_case.last_execute_result.length_range=最近的执行结果长度必须在1-64之间
+functional_case.last_execute_result.not_blank=最近的执行结果不能为空
+functional_case.deleted.length_range=是否在回收站长度必须在1-1之间
+functional_case.deleted.not_blank=是否在回收站不能为空
+functional_case.public_case.length_range=是否是公共用例长度必须在1-1之间
+functional_case.public_case.not_blank=是否是公共用例不能为空
+functional_case.latest.length_range=是否为最新版本长度必须在1-1之间
+functional_case.latest.not_blank=是否为最新版本不能为空
+functional_case.create_user.length_range=创建人长度必须在1-100之间
+functional_case.create_user.not_blank=创建人不能为空
+#module:FunctionalCaseBlob
+functional_case_blob.functional_case_id.not_blank=功能用例ID不能为空
+#module:FunctionalCaseComment
+functional_case_comment.id.not_blank=ID不能为空
+functional_case_comment.case_id.length_range=功能用例ID长度必须在1-50之间
+functional_case_comment.case_id.not_blank=功能用例ID不能为空
+functional_case_comment.create_user.length_range=评论人长度必须在1-50之间
+functional_case_comment.create_user.not_blank=评论人不能为空
+functional_case_comment.type.length_range=评论类型长度必须在1-64之间
+functional_case_comment.type.not_blank=评论类型不能为空
+#module:FunctionalCaseModule
+functional_case_module.id.not_blank=ID不能为空
+functional_case_module.project_id.length_range=项目ID长度必须在1-50之间
+functional_case_module.project_id.not_blank=项目ID不能为空
+functional_case_module.name.length_range=名称长度必须在1-100之间
+functional_case_module.name.not_blank=名称不能为空
+functional_case_module.pos.length_range=同一节点下的顺序长度必须在1-10之间
+functional_case_module.pos.not_blank=同一节点下的顺序不能为空
+functional_case_module.create_user.length_range=创建人长度必须在1-50之间
+functional_case_module.create_user.not_blank=创建人不能为空
diff --git a/backend/framework/sdk/src/main/resources/i18n/functional_zh_TW.properties b/backend/framework/sdk/src/main/resources/i18n/functional_zh_TW.properties
new file mode 100644
index 0000000000..7024b2e04c
--- /dev/null
+++ b/backend/framework/sdk/src/main/resources/i18n/functional_zh_TW.properties
@@ -0,0 +1,49 @@
+#module:FunctionalCase
+functional_case.id.not_blank=ID不能為空
+functional_case.num.not_blank=业务ID不能為空
+functional_case.custom_num.length_range=自定義業務ID長度必須在1-64之間
+functional_case.custom_num.not_blank=自定義業務ID不能為空
+functional_case.module_id.length_range=模塊ID長度必須在1-50之間
+functional_case.module_id.not_blank=模塊ID不能為空
+functional_case.project_id.length_range=項目ID長度必須在1-50之間
+functional_case.project_id.not_blank=項目ID不能為空
+functional_case.name.length_range=名稱長度必須在1-255之間
+functional_case.name.not_blank=名稱不能為空
+functional_case.review_status.length_range=評審狀態長度必須在1-64之間
+functional_case.review_status.not_blank=評審狀態不能為空
+functional_case.step_model.length_range=編輯模式長度必須在1-64之間
+functional_case.step_model.not_blank=編輯模式不能為空
+functional_case.version_id.length_range=版本ID長度必須在1-50之間
+functional_case.version_id.not_blank=版本ID不能為空
+functional_case.ref_id.length_range=指向初始版本ID必须在1-50之間
+functional_case.ref_id.not_blank=指向初始版本ID不能為空
+functional_case.last_execute_result.length_range=最近的執行結果長度必須在1-64之間
+functional_case.last_execute_result.not_blank=最近的執行結果不能為空
+functional_case.deleted.length_range=是否在回收站長度必須在1-1之間
+functional_case.deleted.not_blank=是否在回收站不能為空
+functional_case.public_case.length_range=是否是公共用例長度必須在1-1之間
+functional_case.public_case.not_blank=是否是公共用例不能為空
+functional_case.latest.length_range=是否为最新版本長度必須在1-1之間
+functional_case.latest.not_blank=是否为最新版本不能為空
+functional_case.create_user.length_range=創建人長度必須在1-100之間
+functional_case.create_user.not_blank=創建人不能為空
+#module:FunctionalCaseBlob
+functional_case_blob.functional_case_id.not_blank=功能用例ID不能為空
+#module:FunctionalCaseComment
+functional_case_comment.id.not_blank=ID不能為空
+functional_case_comment.case_id.length_range=功能用例ID長度必須在1-50之間
+functional_case_comment.case_id.not_blank=功能用例ID不能為空
+functional_case_comment.create_user.length_range=評論人長度必須在1-50之間
+functional_case_comment.create_user.not_blank=評論人不能為空
+functional_case_comment.type.length_range=評論類型長度必須在1-64之間
+functional_case_comment.type.not_blank=評論類型不能為空
+#module:FunctionalCaseModule
+functional_case_module.id.not_blank=ID不能為空
+functional_case_module.project_id.length_range=項目ID長度必須在1-50之間
+functional_case_module.project_id.not_blank=項目ID不能為空
+functional_case_module.name.length_range=名稱長度必須在1-100之間
+functional_case_module.name.not_blank=名稱不能為空
+functional_case_module.pos.length_range=同一節點下的順序長度必須在1-10之間
+functional_case_module.pos.not_blank=同一節點下的順序不能為空
+functional_case_module.create_user.length_range=創建人長度必須在1-50之間
+functional_case_module.create_user.not_blank=創建人不能為空
diff --git a/backend/framework/sdk/src/main/resources/i18n/track_en_US.properties b/backend/framework/sdk/src/main/resources/i18n/track_en_US.properties
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/backend/framework/sdk/src/main/resources/i18n/track_zh_CN.properties b/backend/framework/sdk/src/main/resources/i18n/track_zh_CN.properties
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/backend/framework/sdk/src/main/resources/i18n/track_zh_TW.properties b/backend/framework/sdk/src/main/resources/i18n/track_zh_TW.properties
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/backend/services/test-track/pom.xml b/backend/services/functional-test/pom.xml
similarity index 89%
rename from backend/services/test-track/pom.xml
rename to backend/services/functional-test/pom.xml
index ab9d595ce1..db088b8535 100644
--- a/backend/services/test-track/pom.xml
+++ b/backend/services/functional-test/pom.xml
@@ -7,9 +7,9 @@
services
${revision}
- metersphere-test-track
+ metersphere-functional-test
${revision}
- test-track
+ functional-test
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewController.java
new file mode 100644
index 0000000000..a5162fc516
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewController.java
@@ -0,0 +1,16 @@
+package io.metersphere.functional.controller;
+
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import io.metersphere.functional.service.CaseReviewService;
+
+
+@RestController
+@RequestMapping("/case/review")
+public class CaseReviewController {
+
+ @Resource
+ private CaseReviewService caseReviewService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewFollowController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewFollowController.java
new file mode 100644
index 0000000000..15b633b36b
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewFollowController.java
@@ -0,0 +1,16 @@
+package io.metersphere.functional.controller;
+
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import io.metersphere.functional.service.CaseReviewFollowService;
+
+
+@RestController
+@RequestMapping("/case/review/follow")
+public class CaseReviewFollowController {
+
+ @Resource
+ private CaseReviewFollowService caseReviewFollowService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewFunctionalCaseController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewFunctionalCaseController.java
new file mode 100644
index 0000000000..d11138b185
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewFunctionalCaseController.java
@@ -0,0 +1,16 @@
+package io.metersphere.functional.controller;
+
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import io.metersphere.functional.service.CaseReviewFunctionalCaseService;
+
+
+@RestController
+@RequestMapping("/case/review/functional/case")
+public class CaseReviewFunctionalCaseController {
+
+ @Resource
+ private CaseReviewFunctionalCaseService caseReviewFunctionalCaseService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewFunctionalCaseUserController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewFunctionalCaseUserController.java
new file mode 100644
index 0000000000..9ef5429220
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewFunctionalCaseUserController.java
@@ -0,0 +1,16 @@
+package io.metersphere.functional.controller;
+
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import io.metersphere.functional.service.CaseReviewFunctionalCaseUserService;
+
+
+@RestController
+@RequestMapping("/case/review/functional/case/user")
+public class CaseReviewFunctionalCaseUserController {
+
+ @Resource
+ private CaseReviewFunctionalCaseUserService caseReviewFunctionalCaseUserService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewUserController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewUserController.java
new file mode 100644
index 0000000000..c2ad463601
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CaseReviewUserController.java
@@ -0,0 +1,16 @@
+package io.metersphere.functional.controller;
+
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import io.metersphere.functional.service.CaseReviewUserService;
+
+
+@RestController
+@RequestMapping("/case/review/user")
+public class CaseReviewUserController {
+
+ @Resource
+ private CaseReviewUserService caseReviewUserService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CustomFieldTestCaseController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CustomFieldTestCaseController.java
new file mode 100644
index 0000000000..8009a91412
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/CustomFieldTestCaseController.java
@@ -0,0 +1,16 @@
+package io.metersphere.functional.controller;
+
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import io.metersphere.functional.service.CustomFieldTestCaseService;
+
+
+@RestController
+@RequestMapping("/custom/field/test/case")
+public class CustomFieldTestCaseController {
+
+ @Resource
+ private CustomFieldTestCaseService customFieldTestCaseService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseAttachmentController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseAttachmentController.java
new file mode 100644
index 0000000000..ec118b65e0
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseAttachmentController.java
@@ -0,0 +1,16 @@
+package io.metersphere.functional.controller;
+
+
+import io.metersphere.functional.service.FunctionalCaseAttachmentService;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/functional/case/attachment")
+public class FunctionalCaseAttachmentController {
+
+ @Resource
+ private FunctionalCaseAttachmentService functionalCaseAttachmentService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseBlobController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseBlobController.java
new file mode 100644
index 0000000000..5c39f100f0
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseBlobController.java
@@ -0,0 +1,14 @@
+package io.metersphere.functional.controller;
+
+import io.metersphere.functional.service.FunctionalCaseBlobService;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/functional/case/blob")
+public class FunctionalCaseBlobController {
+
+ @Resource
+ private FunctionalCaseBlobService functionalCaseBlobService;
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseCommentController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseCommentController.java
new file mode 100644
index 0000000000..f7ce883f53
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseCommentController.java
@@ -0,0 +1,16 @@
+package io.metersphere.functional.controller;
+
+
+import io.metersphere.functional.service.FunctionalCaseCommentService;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/functional/case/comment")
+public class FunctionalCaseCommentController {
+
+ @Resource
+ private FunctionalCaseCommentService functionalCaseCommentService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseController.java
new file mode 100644
index 0000000000..150e848b4d
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseController.java
@@ -0,0 +1,15 @@
+package io.metersphere.functional.controller;
+
+import io.metersphere.functional.service.FunctionalCaseService;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/functional/case")
+public class FunctionalCaseController {
+
+ @Resource
+ private FunctionalCaseService functionalCaseService;
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseFollowController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseFollowController.java
new file mode 100644
index 0000000000..56d15f9eab
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseFollowController.java
@@ -0,0 +1,16 @@
+package io.metersphere.functional.controller;
+
+import io.metersphere.functional.service.FunctionalCaseFollowService;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/functional/case/follow")
+public class FunctionalCaseFollowController {
+
+ @Resource
+ private FunctionalCaseFollowService functionalCaseFollowService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseModuleController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseModuleController.java
new file mode 100644
index 0000000000..3285bfe085
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseModuleController.java
@@ -0,0 +1,17 @@
+package io.metersphere.functional.controller;
+
+
+import io.metersphere.functional.service.FunctionalCaseModuleService;
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@RestController
+@RequestMapping("/functional/case/Module")
+public class FunctionalCaseModuleController {
+
+ @Resource
+ private FunctionalCaseModuleService functionalCaseModuleService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseRelationshipEdgeController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseRelationshipEdgeController.java
new file mode 100644
index 0000000000..042a7ce11b
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseRelationshipEdgeController.java
@@ -0,0 +1,16 @@
+package io.metersphere.functional.controller;
+
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import io.metersphere.functional.service.FunctionalCaseRelationshipEdgeService;
+
+
+@RestController
+@RequestMapping("/functional/case/relationship/edge")
+public class FunctionalCaseRelationshipEdgeController {
+
+ @Resource
+ private FunctionalCaseRelationshipEdgeService functionalCaseRelationshipEdgeService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseTestController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseTestController.java
new file mode 100644
index 0000000000..841ba07f06
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/FunctionalCaseTestController.java
@@ -0,0 +1,16 @@
+package io.metersphere.functional.controller;
+
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import io.metersphere.functional.service.FunctionalCaseTestService;
+
+
+@RestController
+@RequestMapping("/functional/case/test")
+public class FunctionalCaseTestController {
+
+ @Resource
+ private FunctionalCaseTestService functionalCaseTestService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/MinderExtraNodeController.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/MinderExtraNodeController.java
new file mode 100644
index 0000000000..8b4e3acc7e
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/controller/MinderExtraNodeController.java
@@ -0,0 +1,16 @@
+package io.metersphere.functional.controller;
+
+import jakarta.annotation.Resource;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import io.metersphere.functional.service.MinderExtraNodeService;
+
+
+@RestController
+@RequestMapping("/minder/extra/node")
+public class MinderExtraNodeController {
+
+ @Resource
+ private MinderExtraNodeService minderExtraNodeService;
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewFollowMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewFollowMapper.java
new file mode 100644
index 0000000000..c056df6aa2
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewFollowMapper.java
@@ -0,0 +1,11 @@
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import io.metersphere.functional.domain.CaseReviewFollow;
+
+
+@Mapper
+public interface CaseReviewFollowMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewFunctionalCaseMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewFunctionalCaseMapper.java
new file mode 100644
index 0000000000..f6aa0c6ed6
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewFunctionalCaseMapper.java
@@ -0,0 +1,11 @@
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import io.metersphere.functional.domain.CaseReviewFunctionalCase;
+
+
+@Mapper
+public interface CaseReviewFunctionalCaseMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewFunctionalCaseUserMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewFunctionalCaseUserMapper.java
new file mode 100644
index 0000000000..13d6a9df4d
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewFunctionalCaseUserMapper.java
@@ -0,0 +1,11 @@
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import io.metersphere.functional.domain.CaseReviewFunctionalCaseUser;
+
+
+@Mapper
+public interface CaseReviewFunctionalCaseUserMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewMapper.java
new file mode 100644
index 0000000000..8376b10668
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewMapper.java
@@ -0,0 +1,11 @@
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import io.metersphere.functional.domain.CaseReview;
+
+
+@Mapper
+public interface CaseReviewMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewUserMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewUserMapper.java
new file mode 100644
index 0000000000..7cab0a7201
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CaseReviewUserMapper.java
@@ -0,0 +1,11 @@
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import io.metersphere.functional.domain.CaseReviewUser;
+
+
+@Mapper
+public interface CaseReviewUserMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CustomFieldTestCaseMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CustomFieldTestCaseMapper.java
new file mode 100644
index 0000000000..7b1d8ac037
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/CustomFieldTestCaseMapper.java
@@ -0,0 +1,11 @@
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import io.metersphere.functional.domain.CustomFieldTestCase;
+
+
+@Mapper
+public interface CustomFieldTestCaseMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseAttachmentMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseAttachmentMapper.java
new file mode 100644
index 0000000000..f607d5ebd1
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseAttachmentMapper.java
@@ -0,0 +1,17 @@
+/**
+ * @filename:FunctionalCaseAttachmentDao 2023年5月17日
+ * @project ms V3.x
+ * Copyright(c) 2020 wx Co. Ltd.
+ * All right reserved.
+ */
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import io.metersphere.functional.domain.FunctionalCaseAttachment;
+
+
+@Mapper
+public interface FunctionalCaseAttachmentMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseBlobMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseBlobMapper.java
new file mode 100644
index 0000000000..8cb7bb224f
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseBlobMapper.java
@@ -0,0 +1,17 @@
+/**
+ * @filename:FunctionalCaseBlobDao 2023年5月17日
+ * @project ms V3.x
+ * Copyright(c) 2020 wx Co. Ltd.
+ * All right reserved.
+ */
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import io.metersphere.functional.domain.FunctionalCaseBlob;
+import org.apache.ibatis.annotations.Mapper;
+
+
+@Mapper
+public interface FunctionalCaseBlobMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseCommentMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseCommentMapper.java
new file mode 100644
index 0000000000..6716dd3b29
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseCommentMapper.java
@@ -0,0 +1,9 @@
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import io.metersphere.functional.domain.FunctionalCaseComment;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface FunctionalCaseCommentMapper extends BaseMapper {
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseFollowMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseFollowMapper.java
new file mode 100644
index 0000000000..bfc6eb98e9
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseFollowMapper.java
@@ -0,0 +1,17 @@
+/**
+ * @filename:FunctionalCaseFollowDao 2023年5月17日
+ * @project ms V3.x
+ * Copyright(c) 2020 wx Co. Ltd.
+ * All right reserved.
+ */
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import io.metersphere.functional.domain.FunctionalCaseFollow;
+
+
+@Mapper
+public interface FunctionalCaseFollowMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseMapper.java
new file mode 100644
index 0000000000..64afc463bb
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseMapper.java
@@ -0,0 +1,9 @@
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import io.metersphere.functional.domain.FunctionalCase;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface FunctionalCaseMapper extends BaseMapper {
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseModuleMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseModuleMapper.java
new file mode 100644
index 0000000000..da05a0a783
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseModuleMapper.java
@@ -0,0 +1,17 @@
+/**
+ * @filename:FunctionalCaseModuleDao 2023年5月17日
+ * @project ms V3.x
+ * Copyright(c) 2020 wx Co. Ltd.
+ * All right reserved.
+ */
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import io.metersphere.functional.domain.FunctionalCaseModule;
+
+
+@Mapper
+public interface FunctionalCaseModuleMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseRelationshipEdgeMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseRelationshipEdgeMapper.java
new file mode 100644
index 0000000000..0ccdc0ac88
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseRelationshipEdgeMapper.java
@@ -0,0 +1,17 @@
+/**
+ * @filename:FunctionalCaseRelationshipEdgeDao 2023年5月17日
+ * @project ms V3.x
+ * Copyright(c) 2020 wx Co. Ltd.
+ * All right reserved.
+ */
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import io.metersphere.functional.domain.FunctionalCaseRelationshipEdge;
+
+
+@Mapper
+public interface FunctionalCaseRelationshipEdgeMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseTestMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseTestMapper.java
new file mode 100644
index 0000000000..3e14303f34
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/FunctionalCaseTestMapper.java
@@ -0,0 +1,11 @@
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import io.metersphere.functional.domain.FunctionalCaseTest;
+
+
+@Mapper
+public interface FunctionalCaseTestMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/MinderExtraNodeMapper.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/MinderExtraNodeMapper.java
new file mode 100644
index 0000000000..6ca96cd347
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/mapper/MinderExtraNodeMapper.java
@@ -0,0 +1,11 @@
+package io.metersphere.functional.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import io.metersphere.functional.domain.MinderExtraNode;
+
+
+@Mapper
+public interface MinderExtraNodeMapper extends BaseMapper {
+
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewFollowService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewFollowService.java
new file mode 100644
index 0000000000..c47d6ba4d8
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewFollowService.java
@@ -0,0 +1,17 @@
+package io.metersphere.functional.service;
+
+
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.CaseReviewFollow;
+import io.metersphere.functional.mapper.CaseReviewFollowMapper;
+
+/**
+ * 用例评审关注人表服务实现类
+ *
+ * @date : 2023-5-17
+ */
+@Service
+public class CaseReviewFollowService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseService.java
new file mode 100644
index 0000000000..34ce968e7d
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseService.java
@@ -0,0 +1,17 @@
+package io.metersphere.functional.service;
+
+
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.CaseReviewFunctionalCase;
+import io.metersphere.functional.mapper.CaseReviewFunctionalCaseMapper;
+
+/**
+ * 用例评审和功能用例的中间表服务实现类
+ *
+ * @date : 2023-5-17
+ */
+@Service
+public class CaseReviewFunctionalCaseService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseUserService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseUserService.java
new file mode 100644
index 0000000000..520726e8ba
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewFunctionalCaseUserService.java
@@ -0,0 +1,17 @@
+package io.metersphere.functional.service;
+
+
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.CaseReviewFunctionalCaseUser;
+import io.metersphere.functional.mapper.CaseReviewFunctionalCaseUserMapper;
+
+/**
+ * 功能用例评审和评审人的中间表服务实现类
+ *
+ * @date : 2023-5-17
+ */
+@Service
+public class CaseReviewFunctionalCaseUserService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewService.java
new file mode 100644
index 0000000000..d6c776d2de
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewService.java
@@ -0,0 +1,17 @@
+package io.metersphere.functional.service;
+
+
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.CaseReview;
+import io.metersphere.functional.mapper.CaseReviewMapper;
+
+/**
+ * 用例评审表服务实现类
+ *
+ * @date : 2023-5-17
+ */
+@Service
+public class CaseReviewService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewUserService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewUserService.java
new file mode 100644
index 0000000000..b344129f83
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CaseReviewUserService.java
@@ -0,0 +1,17 @@
+package io.metersphere.functional.service;
+
+
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.CaseReviewUser;
+import io.metersphere.functional.mapper.CaseReviewUserMapper;
+
+/**
+ * 评审和评审人中间表服务实现类
+ *
+ * @date : 2023-5-17
+ */
+@Service
+public class CaseReviewUserService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CustomFieldTestCaseService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CustomFieldTestCaseService.java
new file mode 100644
index 0000000000..3d3d4a99a5
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/CustomFieldTestCaseService.java
@@ -0,0 +1,17 @@
+package io.metersphere.functional.service;
+
+
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.CustomFieldTestCase;
+import io.metersphere.functional.mapper.CustomFieldTestCaseMapper;
+
+/**
+ * 自定义字段功能用例关系表服务实现类
+ *
+ * @date : 2023-5-17
+ */
+@Service
+public class CustomFieldTestCaseService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseAttachmentService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseAttachmentService.java
new file mode 100644
index 0000000000..a1dfae4de7
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseAttachmentService.java
@@ -0,0 +1,13 @@
+package io.metersphere.functional.service;
+
+
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.FunctionalCaseAttachment;
+import io.metersphere.functional.mapper.FunctionalCaseAttachmentMapper;
+
+
+@Service
+public class FunctionalCaseAttachmentService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseBlobService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseBlobService.java
new file mode 100644
index 0000000000..2ad5ef2b14
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseBlobService.java
@@ -0,0 +1,19 @@
+/**
+ * @filename:FunctionalCaseBlobServiceImpl 2023年5月17日
+ * @project ms V3.x
+ * Copyright(c) 2018 wx Co. Ltd.
+ * All right reserved.
+ */
+package io.metersphere.functional.service;
+
+
+import io.metersphere.functional.domain.FunctionalCaseBlob;
+import io.metersphere.functional.mapper.FunctionalCaseBlobMapper;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+
+@Service
+public class FunctionalCaseBlobService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseCommentService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseCommentService.java
new file mode 100644
index 0000000000..52b3d75f2a
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseCommentService.java
@@ -0,0 +1,10 @@
+package io.metersphere.functional.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.FunctionalCaseComment;
+import io.metersphere.functional.mapper.FunctionalCaseCommentMapper;
+import org.springframework.stereotype.Service;
+
+@Service
+public class FunctionalCaseCommentService extends ServiceImpl {
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseFollowService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseFollowService.java
new file mode 100644
index 0000000000..4e6affd2b8
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseFollowService.java
@@ -0,0 +1,19 @@
+/**
+ * @filename:FunctionalCaseFollowServiceImpl 2023年5月17日
+ * @project ms V3.x
+ * Copyright(c) 2018 wx Co. Ltd.
+ * All right reserved.
+ */
+package io.metersphere.functional.service;
+
+
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.FunctionalCaseFollow;
+import io.metersphere.functional.mapper.FunctionalCaseFollowMapper;
+
+
+@Service
+public class FunctionalCaseFollowService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseModuleService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseModuleService.java
new file mode 100644
index 0000000000..1f64b9dd06
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseModuleService.java
@@ -0,0 +1,19 @@
+/**
+ * @filename:FunctionalCaseModuleServiceImpl 2023年5月17日
+ * @project ms V3.x
+ * Copyright(c) 2018 wx Co. Ltd.
+ * All right reserved.
+ */
+package io.metersphere.functional.service;
+
+
+import io.metersphere.functional.mapper.FunctionalCaseModuleMapper;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.FunctionalCaseModule;
+
+
+@Service
+public class FunctionalCaseModuleService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseRelationshipEdgeService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseRelationshipEdgeService.java
new file mode 100644
index 0000000000..72d393975a
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseRelationshipEdgeService.java
@@ -0,0 +1,19 @@
+/**
+ * @filename:FunctionalCaseRelationshipEdgeServiceImpl 2023年5月17日
+ * @project ms V3.x
+ * Copyright(c) 2018 wx Co. Ltd.
+ * All right reserved.
+ */
+package io.metersphere.functional.service;
+
+
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.FunctionalCaseRelationshipEdge;
+import io.metersphere.functional.mapper.FunctionalCaseRelationshipEdgeMapper;
+
+
+@Service
+public class FunctionalCaseRelationshipEdgeService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseService.java
new file mode 100644
index 0000000000..0a12bdde44
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseService.java
@@ -0,0 +1,10 @@
+package io.metersphere.functional.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.FunctionalCase;
+import io.metersphere.functional.mapper.FunctionalCaseMapper;
+import org.springframework.stereotype.Service;
+
+@Service
+public class FunctionalCaseService extends ServiceImpl {
+}
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseTestService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseTestService.java
new file mode 100644
index 0000000000..d22c41afa7
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/FunctionalCaseTestService.java
@@ -0,0 +1,18 @@
+package io.metersphere.functional.service;
+
+
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.FunctionalCaseTest;
+import io.metersphere.functional.mapper.FunctionalCaseTestMapper;
+
+
+/**
+ * 功能用例和其他用例的中间表服务实现类
+ *
+ * @date : 2023-5-17
+ */
+@Service
+public class FunctionalCaseTestService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/functional-test/src/main/java/io/metersphere/functional/service/MinderExtraNodeService.java b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/MinderExtraNodeService.java
new file mode 100644
index 0000000000..feaceaa6c0
--- /dev/null
+++ b/backend/services/functional-test/src/main/java/io/metersphere/functional/service/MinderExtraNodeService.java
@@ -0,0 +1,17 @@
+package io.metersphere.functional.service;
+
+
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.metersphere.functional.domain.MinderExtraNode;
+import io.metersphere.functional.mapper.MinderExtraNodeMapper;
+
+/**
+ * 脑图临时节点服务实现类
+ *
+ * @date : 2023-5-17
+ */
+@Service
+public class MinderExtraNodeService extends ServiceImpl {
+
+}
\ No newline at end of file
diff --git a/backend/services/pom.xml b/backend/services/pom.xml
index 01ad486042..3e48bd772c 100644
--- a/backend/services/pom.xml
+++ b/backend/services/pom.xml
@@ -20,7 +20,7 @@
project-management
system-setting
test-plan
- test-track
+ functional-test
ui-test
workstation
diff --git a/backend/services/test-track/src/main/java/io/metersphere/track/domain/TestCase.java b/backend/services/test-track/src/main/java/io/metersphere/track/domain/TestCase.java
deleted file mode 100644
index 3ab5d7c0a5..0000000000
--- a/backend/services/test-track/src/main/java/io/metersphere/track/domain/TestCase.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package io.metersphere.track.domain;
-
-import lombok.Data;
-
-import java.io.Serializable;
-
-@Data
-public class TestCase implements Serializable {
- private String id;
-
- private String nodeId;
-
- private String testId;
-
- private String nodePath;
-
- private String projectId;
-
- private String name;
-
- private String type;
-
- private String maintainer;
-
- private String priority;
-
- private String method;
-
- private Long createTime;
-
- private Long updateTime;
-
- private Integer sort;
-
- private Integer num;
-
- private String reviewStatus;
-
- private String tags;
-
- private String demandId;
-
- private String demandName;
-
- private String status;
-
- private String stepModel;
-
- private String customNum;
-
- private String createUser;
-
- private String originalStatus;
-
- private Long deleteTime;
-
- private String deleteUserId;
-
- private Long order;
-
- private Boolean casePublic;
-
- private String versionId;
-
- private String refId;
-
- private Boolean latest;
-
- private String lastExecuteResult;
-
- private static final long serialVersionUID = 1L;
-}
\ No newline at end of file