diff --git a/backend/framework/sdk/src/main/resources/i18n/case.properties b/backend/framework/sdk/src/main/resources/i18n/case.properties index 525f0f8d64..6b744b0485 100644 --- a/backend/framework/sdk/src/main/resources/i18n/case.properties +++ b/backend/framework/sdk/src/main/resources/i18n/case.properties @@ -22,6 +22,7 @@ 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.pos.not_blank=顺序不能为空 functional_case.review_status.length_range=评审状态长度必须在1-64之间 functional_case.review_status.not_blank=评审状态不能为空 functional_case.step_model.length_range=编辑模式长度必须在1-64之间 diff --git a/backend/framework/sdk/src/main/resources/i18n/case_en_US.properties b/backend/framework/sdk/src/main/resources/i18n/case_en_US.properties index 6ef4a2f167..4191ac0893 100644 --- a/backend/framework/sdk/src/main/resources/i18n/case_en_US.properties +++ b/backend/framework/sdk/src/main/resources/i18n/case_en_US.properties @@ -23,6 +23,7 @@ functional_case.project_id.not_blank=Project ID cannot be empty functional_case.template_id.not_blank=Template 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.pos.not_blank=Pos 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.case_edit_type.length_range=The length of the editing type must be between 1 and 64 diff --git a/backend/framework/sdk/src/main/resources/i18n/case_zh_CN.properties b/backend/framework/sdk/src/main/resources/i18n/case_zh_CN.properties index 20566caf0b..afd17c789c 100644 --- a/backend/framework/sdk/src/main/resources/i18n/case_zh_CN.properties +++ b/backend/framework/sdk/src/main/resources/i18n/case_zh_CN.properties @@ -22,6 +22,7 @@ functional_case.project_id.not_blank=项目ID不能为空 functional_case.template_id.not_blank=模板ID不能为空 functional_case.name.length_range=名称长度必须在1-255之间 functional_case.name.not_blank=名称不能为空 +functional_case.pos.not_blank=顺序不能为空 functional_case.review_status.length_range=评审状态长度必须在1-64之间 functional_case.review_status.not_blank=评审状态不能为空 functional_case.case_edit_type.length_range=编辑模式长度必须在1-64之间 diff --git a/backend/framework/sdk/src/main/resources/i18n/case_zh_TW.properties b/backend/framework/sdk/src/main/resources/i18n/case_zh_TW.properties index a428dd566b..10d3af3f77 100644 --- a/backend/framework/sdk/src/main/resources/i18n/case_zh_TW.properties +++ b/backend/framework/sdk/src/main/resources/i18n/case_zh_TW.properties @@ -23,6 +23,7 @@ functional_case.project_id.not_blank=項目ID不能為空 functional_case.template_id.not_blank=模板ID不能為空 functional_case.name.length_range=名稱長度必須在1-255之間 functional_case.name.not_blank=名稱不能為空 +functional_case.pos.not_blank=順序不能為空 functional_case.review_status.length_range=評審狀態長度必須在1-64之間 functional_case.review_status.not_blank=評審狀態不能為空 functional_case.case_edit_type.length_range=編輯模式長度必須在1-64之間 diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/constants/MinderLabel.java b/backend/services/case-management/src/main/java/io/metersphere/functional/constants/MinderLabel.java index 40e07e99dc..a0d70c5153 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/constants/MinderLabel.java +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/constants/MinderLabel.java @@ -18,15 +18,18 @@ public enum MinderLabel { * 步骤描述标签 */ STEPS, - + /** + * 步骤描述预期结果标签 + */ + STEPS_EXPECTED_RESULT, /** * 文本描述标签 */ TEXT_DESCRIPTION, /** - * 预期结果标签 + * 文本描述预期结果标签 */ - EXPECTED_RESULT, + TEXT_EXPECTED_RESULT, /** * 备注标签 */ diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/controller/FunctionalCaseMinderController.java b/backend/services/case-management/src/main/java/io/metersphere/functional/controller/FunctionalCaseMinderController.java index 4b23c81913..0d00be96ef 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/controller/FunctionalCaseMinderController.java +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/controller/FunctionalCaseMinderController.java @@ -1,9 +1,10 @@ package io.metersphere.functional.controller; -import io.metersphere.functional.domain.FunctionalCase; import io.metersphere.functional.dto.FunctionalMinderTreeDTO; +import io.metersphere.functional.dto.MinderOptionDTO; import io.metersphere.functional.request.FunctionalCaseMindRequest; import io.metersphere.functional.request.FunctionalCaseMinderEditRequest; +import io.metersphere.functional.request.FunctionalCaseMinderRemoveRequest; import io.metersphere.functional.service.FunctionalCaseLogService; import io.metersphere.functional.service.FunctionalCaseMinderService; import io.metersphere.functional.service.FunctionalCaseNoticeService; @@ -15,6 +16,7 @@ import io.metersphere.system.notice.constants.NoticeConstants; import io.metersphere.system.security.CheckOwner; import io.metersphere.system.utils.SessionUtils; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.Resource; import org.apache.shiro.authz.annotation.RequiresPermissions; @@ -48,20 +50,37 @@ public class FunctionalCaseMinderController { @Log(type = OperationLogType.UPDATE, expression = "#msClass.updateMinderFunctionalCaseLog(#request)", msClass = FunctionalCaseLogService.class) @SendNotice(taskType = NoticeConstants.TaskType.FUNCTIONAL_CASE_TASK, event = NoticeConstants.Event.UPDATE, target = "#targetClass.getMainFunctionalCaseMinderDTO(#request)", targetClass = FunctionalCaseNoticeService.class) @CheckOwner(resourceId = "#request.getId()", resourceType = "functional_case") - public FunctionalCase updateFunctionalCaseName(@Validated @RequestBody FunctionalCaseMinderEditRequest request) { + public void updateFunctionalCaseName(@Validated @RequestBody FunctionalCaseMinderEditRequest request) { String userId = SessionUtils.getUserId(); - return functionalCaseMinderService.updateFunctionalCase(request, userId); + functionalCaseMinderService.updateFunctionalCase(request, userId); } @PostMapping("/update/source/priority") - @Operation(summary = "脑图更新资源名称") + @Operation(summary = "脑图更新用例等级") @RequiresPermissions(PermissionConstants.FUNCTIONAL_CASE_READ_UPDATE) @Log(type = OperationLogType.UPDATE, expression = "#msClass.updateMinderFunctionalCaseLog(#request)", msClass = FunctionalCaseLogService.class) @SendNotice(taskType = NoticeConstants.TaskType.FUNCTIONAL_CASE_TASK, event = NoticeConstants.Event.UPDATE, target = "#targetClass.getMainFunctionalCaseMinderDTO(#request)", targetClass = FunctionalCaseNoticeService.class) @CheckOwner(resourceId = "#request.getId()", resourceType = "functional_case") - public FunctionalCase updateFunctionalCasePriority(@Validated @RequestBody FunctionalCaseMinderEditRequest request) { + public void updateFunctionalCasePriority(@Validated @RequestBody FunctionalCaseMinderEditRequest request) { String userId = SessionUtils.getUserId(); - return functionalCaseMinderService.updateFunctionalCase(request, userId); + functionalCaseMinderService.updateFunctionalCase(request, userId); + } + + @PostMapping("/batch/remove") + @Operation(summary = "脑图批量移动(移动到某个节点下或者移动排序)") + @RequiresPermissions(PermissionConstants.FUNCTIONAL_CASE_READ_UPDATE) + public void removeFunctionalCaseBatch(@Validated @RequestBody FunctionalCaseMinderRemoveRequest request) { + String userId = SessionUtils.getUserId(); + functionalCaseMinderService.removeFunctionalCaseBatch(request, userId); + } + + @PostMapping("/batch/delete/{projectId}") + @Operation(summary = "脑图批量删除") + @RequiresPermissions(PermissionConstants.FUNCTIONAL_CASE_READ_DELETE) + @Log(type = OperationLogType.DELETE, expression = "#msClass.deleteBatchMinderFunctionalCaseLog(#resourceList)", msClass = FunctionalCaseLogService.class) + public void deleteFunctionalCaseBatch(@PathVariable String projectId, @Validated @RequestBody @Schema(description = "节点和节点类型的集合", requiredMode = Schema.RequiredMode.REQUIRED) List resourceList) { + String userId = SessionUtils.getUserId(); + functionalCaseMinderService.deleteFunctionalCaseBatch(projectId, resourceList, userId); } } diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/dto/FunctionalCaseMindDTO.java b/backend/services/case-management/src/main/java/io/metersphere/functional/dto/FunctionalCaseMindDTO.java index 39d46e605b..0953d01576 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/dto/FunctionalCaseMindDTO.java +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/dto/FunctionalCaseMindDTO.java @@ -50,6 +50,11 @@ public class FunctionalCaseMindDTO { @NotNull(message = "{functional_case.pos.not_blank}", groups = {Created.class}) private Long pos; + @Schema(description = "编辑模式:步骤模式/文本模式", requiredMode = Schema.RequiredMode.REQUIRED) + @NotBlank(message = "{functional_case.case_edit_type.not_blank}", groups = {Created.class}) + @Size(min = 1, max = 50, message = "{functional_case.case_edit_type.length_range}", groups = {Created.class, Updated.class}) + private String caseEditType; + @Schema(description = "用例步骤(JSON),step_model 为 Step 时启用") private byte[] steps; diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/dto/MinderOptionDTO.java b/backend/services/case-management/src/main/java/io/metersphere/functional/dto/MinderOptionDTO.java new file mode 100644 index 0000000000..9d350b7686 --- /dev/null +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/dto/MinderOptionDTO.java @@ -0,0 +1,28 @@ +package io.metersphere.functional.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author guoyuqi + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class MinderOptionDTO { + + @Schema(description = "节点ID,如果是用例的子节点,比如 前置条件,步骤描述,等传其父节点ID") + @NotBlank(message = "{functional_case.id.not_blank}") + private String id; + + @Schema(description = "节点类型") + @NotBlank(message = "{functional_case_test.test_type.not_blank}") + private String type; + + @Schema(description = "节点顺序") + @NotBlank(message = "{functional_case.pos.not_blank}") + private Long pos; +} diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/dto/MinderTargetDTO.java b/backend/services/case-management/src/main/java/io/metersphere/functional/dto/MinderTargetDTO.java new file mode 100644 index 0000000000..8899379538 --- /dev/null +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/dto/MinderTargetDTO.java @@ -0,0 +1,21 @@ +package io.metersphere.functional.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author guoyuqi + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class MinderTargetDTO { + + @Schema(description = "移动排序的目标id", requiredMode = Schema.RequiredMode.REQUIRED) + private String targetId; + + @Schema(description = "移动方式(BEFORE AFTER)", requiredMode = Schema.RequiredMode.REQUIRED) + private String moveMode; +} diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseBlobMapper.java b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseBlobMapper.java new file mode 100644 index 0000000000..8bf046bc9c --- /dev/null +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseBlobMapper.java @@ -0,0 +1,13 @@ +package io.metersphere.functional.mapper; + +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author guoyuqi + */ +public interface ExtFunctionalCaseBlobMapper { + + void batchUpdateColumn(@Param("column") String column, @Param("ids") List ids, @Param("value") byte[] value); +} diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseBlobMapper.xml b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseBlobMapper.xml new file mode 100644 index 0000000000..ed2be506be --- /dev/null +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseBlobMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + update functional_case_blob + set ${column} = #{value,jdbcType=LONGVARBINARY} + where id in + + #{id} + + + + + + \ No newline at end of file diff --git a/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseMapper.xml b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseMapper.xml index e83be1e844..cbd05916f1 100644 --- a/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseMapper.xml +++ b/backend/services/case-management/src/main/java/io/metersphere/functional/mapper/ExtFunctionalCaseMapper.xml @@ -782,7 +782,7 @@