From baba30d20132a7fc3032d123798483c4a488503e Mon Sep 17 00:00:00 2001 From: uname <2986773479@qq.com> Date: Tue, 30 Sep 2025 10:55:28 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feature:=E6=95=B0=E6=8D=AE=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=8E=A5=E5=8F=A3=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/openapi/specs/data-management.yaml | 30 +++++--- .../interfaces/rest/DatasetController.java | 14 ++-- .../rest/DatasetFileController.java | 12 ++-- .../rest/DatasetTypeController.java | 6 +- .../interfaces/rest/TagController.java | 4 +- .../service/DatasetControllerTest.java | 63 ++++++++-------- .../rest/DatasetFileControllerTest.java | 72 +++++++++---------- .../rest/DatasetTypeControllerTest.java | 38 +++++----- .../interfaces/rest/TagControllerTest.java | 37 +++++----- 9 files changed, 144 insertions(+), 132 deletions(-) diff --git a/backend/openapi/specs/data-management.yaml b/backend/openapi/specs/data-management.yaml index 9ee2b73db..303753713 100644 --- a/backend/openapi/specs/data-management.yaml +++ b/backend/openapi/specs/data-management.yaml @@ -27,9 +27,10 @@ tags: description: 标签管理 paths: - /datasets: + /data-management/datasets: get: tags: [Dataset] + operationId: getDatasets summary: 获取数据集列表 description: 分页查询数据集列表,支持按类型、标签等条件筛选 parameters: @@ -82,6 +83,7 @@ paths: post: tags: [Dataset] + operationId: createDataset summary: 创建数据集 description: 创建新的数据集 requestBody: @@ -104,9 +106,10 @@ paths: schema: $ref: '#/components/schemas/ErrorResponse' - /datasets/{datasetId}: + /data-management/datasets/{datasetId}: get: tags: [Dataset] + operationId: getDatasetById summary: 获取数据集详情 description: 根据ID获取数据集详细信息 parameters: @@ -133,6 +136,7 @@ paths: put: tags: [Dataset] summary: 更新数据集 + operationId: updateDataset description: 更新数据集信息 parameters: - name: datasetId @@ -163,6 +167,7 @@ paths: delete: tags: [Dataset] + operationId: deleteDataset summary: 删除数据集 description: 删除指定的数据集 parameters: @@ -182,10 +187,11 @@ paths: schema: $ref: '#/components/schemas/ErrorResponse' - /datasets/{datasetId}/files: + /data-management/datasets/{datasetId}/files: get: tags: [DatasetFile] summary: 获取数据集文件列表 + operationId: getDatasetFiles description: 分页获取数据集中的文件列表 parameters: - name: datasetId @@ -228,6 +234,7 @@ paths: post: tags: [DatasetFile] summary: 上传文件到数据集 + operationId: uploadDatasetFile description: 向指定数据集上传文件 parameters: - name: datasetId @@ -258,11 +265,12 @@ paths: schema: $ref: '#/components/schemas/DatasetFileResponse' - /datasets/{datasetId}/files/{fileId}: + /data-management/datasets/{datasetId}/files/{fileId}: get: tags: [DatasetFile] summary: 获取文件详情 description: 获取数据集中指定文件的详细信息 + operationId: getDatasetFileById parameters: - name: datasetId in: path @@ -287,6 +295,7 @@ paths: delete: tags: [DatasetFile] summary: 删除文件 + operationId: deleteDatasetFile description: 从数据集中删除指定文件 parameters: - name: datasetId @@ -305,9 +314,10 @@ paths: '204': description: 删除成功 - /datasets/{datasetId}/files/{fileId}/download: + /data-management/datasets/{datasetId}/files/{fileId}/download: get: tags: [DatasetFile] + operationId: downloadDatasetFile summary: 下载文件 description: 下载数据集中的指定文件 parameters: @@ -332,8 +342,9 @@ paths: type: string format: binary - /dataset-types: + /data-management/dataset-types: get: + operationId: getDatasetTypes tags: [DatasetType] summary: 获取数据集类型列表 description: 获取所有支持的数据集类型 @@ -347,9 +358,10 @@ paths: items: $ref: '#/components/schemas/DatasetTypeResponse' - /tags: + /data-management/tags: get: tags: [Tag] + operationId: getTags summary: 获取标签列表 description: 获取所有可用的标签 parameters: @@ -370,6 +382,7 @@ paths: post: tags: [Tag] + operationId: createTag summary: 创建标签 description: 创建新的标签 requestBody: @@ -386,9 +399,10 @@ paths: schema: $ref: '#/components/schemas/TagResponse' - /datasets/{datasetId}/statistics: + /data-management/datasets/{datasetId}/statistics: get: tags: [Dataset] + operationId: getDatasetStatistics summary: 获取数据集统计信息 description: 获取数据集的统计信息(文件数量、大小、完成度等) parameters: diff --git a/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/DatasetController.java b/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/DatasetController.java index feb47fab3..b07f0350f 100644 --- a/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/DatasetController.java +++ b/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/DatasetController.java @@ -32,8 +32,8 @@ public DatasetController(DatasetApplicationService datasetApplicationService) { } @Override - public ResponseEntity datasetsGet(Integer page, Integer size, String type, - String tags, String keyword, String status) { + public ResponseEntity getDatasets(Integer page, Integer size, String type, + String tags, String keyword, String status) { Pageable pageable = PageRequest.of(page != null ? page : 0, size != null ? size : 20); List tagList = null; @@ -58,7 +58,7 @@ public ResponseEntity datasetsGet(Integer page, Integer si } @Override - public ResponseEntity datasetsPost(CreateDatasetRequest createDatasetRequest) { + public ResponseEntity createDataset(CreateDatasetRequest createDatasetRequest) { try { Long dataSourceId = null; if (createDatasetRequest.getDataSource() != null) { @@ -82,7 +82,7 @@ public ResponseEntity datasetsPost(CreateDatasetRequest createD } @Override - public ResponseEntity datasetsDatasetIdGet(String datasetId) { + public ResponseEntity getDatasetById(String datasetId) { try { Dataset dataset = datasetApplicationService.getDataset(datasetId); return ResponseEntity.ok(convertToResponse(dataset)); @@ -92,7 +92,7 @@ public ResponseEntity datasetsDatasetIdGet(String datasetId) { } @Override - public ResponseEntity datasetsDatasetIdPut(String datasetId, UpdateDatasetRequest updateDatasetRequest) { + public ResponseEntity updateDataset(String datasetId, UpdateDatasetRequest updateDatasetRequest) { try { Dataset dataset = datasetApplicationService.updateDataset( datasetId, @@ -109,7 +109,7 @@ public ResponseEntity datasetsDatasetIdPut(String datasetId, Up } @Override - public ResponseEntity datasetsDatasetIdDelete(String datasetId) { + public ResponseEntity deleteDataset(String datasetId) { try { datasetApplicationService.deleteDataset(datasetId); return ResponseEntity.noContent().build(); @@ -119,7 +119,7 @@ public ResponseEntity datasetsDatasetIdDelete(String datasetId) { } @Override - public ResponseEntity datasetsDatasetIdStatisticsGet(String datasetId) { + public ResponseEntity getDatasetStatistics(String datasetId) { try { Map stats = datasetApplicationService.getDatasetStatistics(datasetId); diff --git a/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/DatasetFileController.java b/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/DatasetFileController.java index f66110fba..f6983eed0 100644 --- a/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/DatasetFileController.java +++ b/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/DatasetFileController.java @@ -34,8 +34,8 @@ public DatasetFileController(DatasetFileApplicationService datasetFileApplicatio } @Override - public ResponseEntity datasetsDatasetIdFilesGet(String datasetId, Integer page, Integer size, - String fileType, String status) { + public ResponseEntity getDatasetFiles(String datasetId, Integer page, Integer size, + String fileType, String status) { Pageable pageable = PageRequest.of(page != null ? page : 0, size != null ? size : 20); Page filesPage = datasetFileApplicationService.getDatasetFiles( @@ -56,7 +56,7 @@ public ResponseEntity datasetsDatasetIdFilesGet(String } @Override - public ResponseEntity datasetsDatasetIdFilesPost(String datasetId, MultipartFile file, String description) { + public ResponseEntity uploadDatasetFile(String datasetId, MultipartFile file, String description) { try { DatasetFile datasetFile = datasetFileApplicationService.uploadFile( datasetId, file, description, "system"); @@ -70,7 +70,7 @@ public ResponseEntity datasetsDatasetIdFilesPost(String dat } @Override - public ResponseEntity datasetsDatasetIdFilesFileIdGet(String datasetId, String fileId) { + public ResponseEntity getDatasetFileById(String datasetId, String fileId) { try { DatasetFile datasetFile = datasetFileApplicationService.getDatasetFile(datasetId, fileId); return ResponseEntity.ok(convertToResponse(datasetFile)); @@ -80,7 +80,7 @@ public ResponseEntity datasetsDatasetIdFilesFileIdGet(Strin } @Override - public ResponseEntity datasetsDatasetIdFilesFileIdDelete(String datasetId, String fileId) { + public ResponseEntity deleteDatasetFile(String datasetId, String fileId) { try { datasetFileApplicationService.deleteDatasetFile(datasetId, fileId); return ResponseEntity.noContent().build(); @@ -90,7 +90,7 @@ public ResponseEntity datasetsDatasetIdFilesFileIdDelete(String datasetId, } @Override - public ResponseEntity datasetsDatasetIdFilesFileIdDownloadGet(String datasetId, String fileId) { + public ResponseEntity downloadDatasetFile(String datasetId, String fileId) { try { DatasetFile datasetFile = datasetFileApplicationService.getDatasetFile(datasetId, fileId); Resource resource = datasetFileApplicationService.downloadFile(datasetId, fileId); diff --git a/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/DatasetTypeController.java b/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/DatasetTypeController.java index 4c5882c78..58595ffa2 100644 --- a/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/DatasetTypeController.java +++ b/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/DatasetTypeController.java @@ -15,7 +15,7 @@ public class DatasetTypeController implements DatasetTypeApi { @Override - public ResponseEntity> datasetTypesGet() { + public ResponseEntity> getDatasetTypes() { // 硬编码的数据集类型,实际应用中可以从数据库获取 List types = Arrays.asList( createDatasetType("IMAGE", "图像数据集", "用于机器学习的图像数据集", Arrays.asList("jpg", "jpeg", "png", "bmp", "gif")), @@ -24,7 +24,7 @@ public ResponseEntity> datasetTypesGet() { createDatasetType("VIDEO", "视频数据集", "用于视频分析的视频数据集", Arrays.asList("mp4", "avi", "mov", "mkv")), createDatasetType("MULTIMODAL", "多模态数据集", "包含多种数据类型的数据集", Arrays.asList("*")) ); - + return ResponseEntity.ok(types); } @@ -35,7 +35,7 @@ private DatasetTypeResponse createDatasetType(String code, String name, String d response.setDescription(description); response.setSupportedFormats(supportedFormats); response.setIcon(getIconForType(code)); - + return response; } diff --git a/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/TagController.java b/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/TagController.java index e9fb31b78..76e850f92 100644 --- a/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/TagController.java +++ b/backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/TagController.java @@ -27,7 +27,7 @@ public TagController(TagApplicationService tagApplicationService) { } @Override - public ResponseEntity> tagsGet(String keyword) { + public ResponseEntity> getTags(String keyword) { List tags = tagApplicationService.searchTags(keyword); List response = tags.stream() @@ -38,7 +38,7 @@ public ResponseEntity> tagsGet(String keyword) { } @Override - public ResponseEntity tagsPost(CreateTagRequest createTagRequest) { + public ResponseEntity createTag(CreateTagRequest createTagRequest) { try { Tag tag = tagApplicationService.createTag( createTagRequest.getName(), diff --git a/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/application/service/DatasetControllerTest.java b/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/application/service/DatasetControllerTest.java index 01ebccb72..08bd9b253 100644 --- a/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/application/service/DatasetControllerTest.java +++ b/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/application/service/DatasetControllerTest.java @@ -1,6 +1,5 @@ package com.dataengine.datamanagement.application.service; -import com.dataengine.datamanagement.application.service.DatasetApplicationService; import com.dataengine.datamanagement.domain.model.dataset.Dataset; import com.dataengine.datamanagement.domain.model.dataset.StatusConstants; import com.dataengine.datamanagement.domain.model.dataset.Tag; @@ -70,7 +69,7 @@ void setUp() { @Test @DisplayName("datasetsGet: 正常分页查询数据集") - void datasetsGet_success() { + void getDatasets_success() { // Given List datasets = Arrays.asList(sampleDataset); Page page = new PageImpl<>(datasets, PageRequest.of(0, 20), 1); @@ -78,7 +77,7 @@ void datasetsGet_success() { eq(Arrays.asList("tag1", "tag2")), any())).thenReturn(page); // When - ResponseEntity response = controller.datasetsGet(0, 20, "CSV", + ResponseEntity response = controller.getDatasets(0, 20, "CSV", "tag1,tag2", "test", "ACTIVE"); // Then @@ -105,12 +104,12 @@ void datasetsGet_success() { @Test @DisplayName("datasetsGet: 默认分页参数") - void datasetsGet_defaultPaging() { + void getDatasets_defaultPaging() { Page emptyPage = new PageImpl<>(Collections.emptyList(), PageRequest.of(0, 20), 0); when(datasetApplicationService.getDatasets(isNull(), isNull(), isNull(), isNull(), any())) .thenReturn(emptyPage); - ResponseEntity response = controller.datasetsGet(null, null, null, + ResponseEntity response = controller.getDatasets(null, null, null, null, null, null); assertEquals(HttpStatus.OK, response.getStatusCode()); @@ -121,23 +120,23 @@ void datasetsGet_defaultPaging() { @Test @DisplayName("datasetsGet: 标签参数解析") - void datasetsGet_tagsProcessing() { + void getDatasets_tagsProcessing() { Page page = new PageImpl<>(Collections.emptyList(), PageRequest.of(0, 20), 0); when(datasetApplicationService.getDatasets(isNull(), isNull(), isNull(), any(), any())) .thenReturn(page); // 测试空标签 - controller.datasetsGet(null, null, null, "", null, null); + controller.getDatasets(null, null, null, "", null, null); verify(datasetApplicationService).getDatasets(isNull(), isNull(), isNull(), isNull(), any()); // 测试空白标签 - controller.datasetsGet(null, null, null, " ", null, null); + controller.getDatasets(null, null, null, " ", null, null); verify(datasetApplicationService, times(2)).getDatasets(isNull(), isNull(), isNull(), isNull(), any()); } @Test @DisplayName("datasetsPost: 正常创建数据集") - void datasetsPost_success() { + void createDataset_success() { CreateDatasetRequest request = new CreateDatasetRequest(); request.setName("New Dataset"); request.setDescription("New description"); @@ -150,7 +149,7 @@ void datasetsPost_success() { eq("JSON"), eq(Arrays.asList("tag1", "tag2")), eq(123L), eq("/new/path"), isNull(), eq("system"))).thenReturn(sampleDataset); - ResponseEntity response = controller.datasetsPost(request); + ResponseEntity response = controller.createDataset(request); assertEquals(HttpStatus.CREATED, response.getStatusCode()); assertNotNull(response.getBody()); @@ -162,7 +161,7 @@ void datasetsPost_success() { @Test @DisplayName("datasetsPost: 数据源ID转换异常时传入null") - void datasetsPost_invalidDataSourceId() { + void createDataset_invalidDataSourceId() { CreateDatasetRequest request = new CreateDatasetRequest(); request.setName("New Dataset"); request.setDataSource("invalid-id"); @@ -171,7 +170,7 @@ void datasetsPost_invalidDataSourceId() { isNull(), isNull(), isNull(), isNull(), isNull(), eq("system"))) .thenReturn(sampleDataset); - ResponseEntity response = controller.datasetsPost(request); + ResponseEntity response = controller.createDataset(request); assertEquals(HttpStatus.CREATED, response.getStatusCode()); verify(datasetApplicationService).createDataset(eq("New Dataset"), isNull(), @@ -180,14 +179,14 @@ void datasetsPost_invalidDataSourceId() { @Test @DisplayName("datasetsPost: 服务抛异常时返回400") - void datasetsPost_serviceException() { + void createDataset_serviceException() { CreateDatasetRequest request = new CreateDatasetRequest(); request.setName("Duplicate Dataset"); when(datasetApplicationService.createDataset(anyString(), any(), any(), any(), any(), any(), any(), anyString())).thenThrow(new IllegalArgumentException("Already exists")); - ResponseEntity response = controller.datasetsPost(request); + ResponseEntity response = controller.createDataset(request); assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); assertNull(response.getBody()); @@ -195,10 +194,10 @@ void datasetsPost_serviceException() { @Test @DisplayName("datasetsDatasetIdGet: 正常获取数据集详情") - void datasetsDatasetIdGet_success() { + void getDatasetById_success() { when(datasetApplicationService.getDataset("dataset-id-1")).thenReturn(sampleDataset); - ResponseEntity response = controller.datasetsDatasetIdGet("dataset-id-1"); + ResponseEntity response = controller.getDatasetById("dataset-id-1"); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getBody()); @@ -216,11 +215,11 @@ void datasetsDatasetIdGet_success() { @Test @DisplayName("datasetsDatasetIdGet: 数据集不存在时返回404") - void datasetsDatasetIdGet_notFound() { + void getDatasetById_notFound() { when(datasetApplicationService.getDataset("not-exist")) .thenThrow(new IllegalArgumentException("Dataset not found")); - ResponseEntity response = controller.datasetsDatasetIdGet("not-exist"); + ResponseEntity response = controller.getDatasetById("not-exist"); assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); assertNull(response.getBody()); @@ -229,7 +228,7 @@ void datasetsDatasetIdGet_notFound() { @Test @DisplayName("datasetsDatasetIdPut: 状态为null时传入null") - void datasetsDatasetIdPut_nullStatus() { + void updateDataset_nullStatus() { UpdateDatasetRequest request = new UpdateDatasetRequest(); request.setName("Updated Name"); request.setStatus(null); @@ -237,7 +236,7 @@ void datasetsDatasetIdPut_nullStatus() { when(datasetApplicationService.updateDataset(eq("dataset-id-1"), eq("Updated Name"), isNull(), isNull(), isNull())).thenReturn(sampleDataset); - ResponseEntity response = controller.datasetsDatasetIdPut("dataset-id-1", request); + ResponseEntity response = controller.updateDataset("dataset-id-1", request); assertEquals(HttpStatus.OK, response.getStatusCode()); verify(datasetApplicationService).updateDataset(eq("dataset-id-1"), eq("Updated Name"), @@ -246,14 +245,14 @@ void datasetsDatasetIdPut_nullStatus() { @Test @DisplayName("datasetsDatasetIdPut: 数据集不存在时返回404") - void datasetsDatasetIdPut_notFound() { + void updateDataset_notFound() { UpdateDatasetRequest request = new UpdateDatasetRequest(); request.setName("Updated Name"); when(datasetApplicationService.updateDataset(anyString(), anyString(), any(), any(), any())) .thenThrow(new IllegalArgumentException("Dataset not found")); - ResponseEntity response = controller.datasetsDatasetIdPut("not-exist", request); + ResponseEntity response = controller.updateDataset("not-exist", request); assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); assertNull(response.getBody()); @@ -261,10 +260,10 @@ void datasetsDatasetIdPut_notFound() { @Test @DisplayName("datasetsDatasetIdDelete: 正常删除数据集") - void datasetsDatasetIdDelete_success() { + void deleteDataset_success() { doNothing().when(datasetApplicationService).deleteDataset("dataset-id-1"); - ResponseEntity response = controller.datasetsDatasetIdDelete("dataset-id-1"); + ResponseEntity response = controller.deleteDataset("dataset-id-1"); assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode()); verify(datasetApplicationService).deleteDataset("dataset-id-1"); @@ -272,18 +271,18 @@ void datasetsDatasetIdDelete_success() { @Test @DisplayName("datasetsDatasetIdDelete: 数据集不存在时返回404") - void datasetsDatasetIdDelete_notFound() { + void deleteDataset_notFound() { doThrow(new IllegalArgumentException("Dataset not found")) .when(datasetApplicationService).deleteDataset("not-exist"); - ResponseEntity response = controller.datasetsDatasetIdDelete("not-exist"); + ResponseEntity response = controller.deleteDataset("not-exist"); assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); } @Test @DisplayName("datasetsDatasetIdStatisticsGet: 正常获取统计信息") - void datasetsDatasetIdStatisticsGet_success() { + void getDatasetStatistics_success() { Map stats = new HashMap<>(); stats.put("totalFiles", 100); stats.put("completedFiles", 80); @@ -294,7 +293,7 @@ void datasetsDatasetIdStatisticsGet_success() { when(datasetApplicationService.getDatasetStatistics("dataset-id-1")).thenReturn(stats); - ResponseEntity response = controller.datasetsDatasetIdStatisticsGet("dataset-id-1"); + ResponseEntity response = controller.getDatasetStatistics("dataset-id-1"); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getBody()); @@ -310,11 +309,11 @@ void datasetsDatasetIdStatisticsGet_success() { @Test @DisplayName("datasetsDatasetIdStatisticsGet: 数据集不存在时返回404") - void datasetsDatasetIdStatisticsGet_notFound() { + void getDatasetStatistics_notFound() { when(datasetApplicationService.getDatasetStatistics("not-exist")) .thenThrow(new IllegalArgumentException("Dataset not found")); - ResponseEntity response = controller.datasetsDatasetIdStatisticsGet("not-exist"); + ResponseEntity response = controller.getDatasetStatistics("not-exist"); assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); assertNull(response.getBody()); @@ -322,11 +321,11 @@ void datasetsDatasetIdStatisticsGet_notFound() { @Test @DisplayName("datasetsDatasetIdStatisticsGet: 其他异常时返回500") - void datasetsDatasetIdStatisticsGet_internalError() { + void getDatasetStatistics_internalError() { when(datasetApplicationService.getDatasetStatistics("dataset-id-1")) .thenThrow(new RuntimeException("Internal error")); - ResponseEntity response = controller.datasetsDatasetIdStatisticsGet("dataset-id-1"); + ResponseEntity response = controller.getDatasetStatistics("dataset-id-1"); assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); assertNull(response.getBody()); diff --git a/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/interfaces/rest/DatasetFileControllerTest.java b/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/interfaces/rest/DatasetFileControllerTest.java index 845030272..aa38badb7 100644 --- a/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/interfaces/rest/DatasetFileControllerTest.java +++ b/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/interfaces/rest/DatasetFileControllerTest.java @@ -61,15 +61,15 @@ void setUp() { @Test @DisplayName("datasetsDatasetIdFilesGet: 正常分页查询文件列表") - void datasetsDatasetIdFilesGet_success() { + void getDatasetFiles_success() { // Given List files = Arrays.asList(sampleFile); Page page = new PageImpl<>(files, PageRequest.of(0, 20), 1); - when(datasetFileApplicationService.getDatasetFiles(eq("dataset-id-1"), eq("text/csv"), + when(datasetFileApplicationService.getDatasetFiles(eq("dataset-id-1"), eq("text/csv"), eq(StatusConstants.DatasetFileStatuses.COMPLETED), any())).thenReturn(page); // When - ResponseEntity response = controller.datasetsDatasetIdFilesGet( + ResponseEntity response = controller.getDatasetFiles( "dataset-id-1", 0, 20, "text/csv", StatusConstants.DatasetFileStatuses.COMPLETED); // Then @@ -90,34 +90,34 @@ void datasetsDatasetIdFilesGet_success() { assertEquals(1024L, fileResponse.getSize()); assertEquals("/path/to/test-file.csv", fileResponse.getFilePath()); - verify(datasetFileApplicationService).getDatasetFiles(eq("dataset-id-1"), eq("text/csv"), + verify(datasetFileApplicationService).getDatasetFiles(eq("dataset-id-1"), eq("text/csv"), eq(StatusConstants.DatasetFileStatuses.COMPLETED), any()); } @Test @DisplayName("datasetsDatasetIdFilesGet: 默认分页参数") - void datasetsDatasetIdFilesGet_defaultPaging() { + void getDatasetFiles_defaultPaging() { Page emptyPage = new PageImpl<>(Collections.emptyList(), PageRequest.of(0, 20), 0); when(datasetFileApplicationService.getDatasetFiles(eq("dataset-id-1"), isNull(), isNull(), any())) .thenReturn(emptyPage); - ResponseEntity response = controller.datasetsDatasetIdFilesGet( + ResponseEntity response = controller.getDatasetFiles( "dataset-id-1", null, null, null, null); assertEquals(HttpStatus.OK, response.getStatusCode()); assertTrue(response.getBody().getContent().isEmpty()); - verify(datasetFileApplicationService).getDatasetFiles(eq("dataset-id-1"), isNull(), isNull(), + verify(datasetFileApplicationService).getDatasetFiles(eq("dataset-id-1"), isNull(), isNull(), argThat(pageable -> pageable.getPageNumber() == 0 && pageable.getPageSize() == 20)); } @Test @DisplayName("datasetsDatasetIdFilesGet: 空结果集") - void datasetsDatasetIdFilesGet_emptyResult() { + void getDatasetFiles_emptyResult() { Page emptyPage = new PageImpl<>(Collections.emptyList(), PageRequest.of(0, 10), 0); when(datasetFileApplicationService.getDatasetFiles(eq("dataset-id-1"), isNull(), isNull(), any())) .thenReturn(emptyPage); - ResponseEntity response = controller.datasetsDatasetIdFilesGet( + ResponseEntity response = controller.getDatasetFiles( "dataset-id-1", 0, 10, null, null); assertEquals(HttpStatus.OK, response.getStatusCode()); @@ -127,11 +127,11 @@ void datasetsDatasetIdFilesGet_emptyResult() { @Test @DisplayName("datasetsDatasetIdFilesPost: 正常上传文件") - void datasetsDatasetIdFilesPost_success() { - when(datasetFileApplicationService.uploadFile(eq("dataset-id-1"), eq(multipartFile), + void uploadDatasetFile_success() { + when(datasetFileApplicationService.uploadFile(eq("dataset-id-1"), eq(multipartFile), eq("Test description"), eq("system"))).thenReturn(sampleFile); - ResponseEntity response = controller.datasetsDatasetIdFilesPost( + ResponseEntity response = controller.uploadDatasetFile( "dataset-id-1", multipartFile, "Test description"); assertEquals(HttpStatus.CREATED, response.getStatusCode()); @@ -141,17 +141,17 @@ void datasetsDatasetIdFilesPost_success() { assertEquals("text/csv", response.getBody().getFileType()); assertEquals(1024L, response.getBody().getSize()); - verify(datasetFileApplicationService).uploadFile(eq("dataset-id-1"), eq(multipartFile), + verify(datasetFileApplicationService).uploadFile(eq("dataset-id-1"), eq(multipartFile), eq("Test description"), eq("system")); } @Test @DisplayName("datasetsDatasetIdFilesPost: 非法参数时返回400") - void datasetsDatasetIdFilesPost_badRequest() { - when(datasetFileApplicationService.uploadFile(eq("dataset-id-1"), eq(multipartFile), + void uploadDatasetFile_badRequest() { + when(datasetFileApplicationService.uploadFile(eq("dataset-id-1"), eq(multipartFile), any(), eq("system"))).thenThrow(new IllegalArgumentException("Dataset not found")); - ResponseEntity response = controller.datasetsDatasetIdFilesPost( + ResponseEntity response = controller.uploadDatasetFile( "dataset-id-1", multipartFile, "desc"); assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); @@ -160,11 +160,11 @@ void datasetsDatasetIdFilesPost_badRequest() { @Test @DisplayName("datasetsDatasetIdFilesPost: 运行时异常时返回500") - void datasetsDatasetIdFilesPost_internalError() { - when(datasetFileApplicationService.uploadFile(eq("dataset-id-1"), eq(multipartFile), + void uploadDatasetFile_internalError() { + when(datasetFileApplicationService.uploadFile(eq("dataset-id-1"), eq(multipartFile), any(), eq("system"))).thenThrow(new RuntimeException("IO error")); - ResponseEntity response = controller.datasetsDatasetIdFilesPost( + ResponseEntity response = controller.uploadDatasetFile( "dataset-id-1", multipartFile, "desc"); assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); @@ -173,11 +173,11 @@ void datasetsDatasetIdFilesPost_internalError() { @Test @DisplayName("datasetsDatasetIdFilesFileIdGet: 正常获取文件详情") - void datasetsDatasetIdFilesFileIdGet_success() { + void getDatasetFileById_success() { when(datasetFileApplicationService.getDatasetFile("dataset-id-1", "file-id-1")) .thenReturn(sampleFile); - ResponseEntity response = controller.datasetsDatasetIdFilesFileIdGet( + ResponseEntity response = controller.getDatasetFileById( "dataset-id-1", "file-id-1"); assertEquals(HttpStatus.OK, response.getStatusCode()); @@ -191,11 +191,11 @@ void datasetsDatasetIdFilesFileIdGet_success() { @Test @DisplayName("datasetsDatasetIdFilesFileIdGet: 文件不存在时返回404") - void datasetsDatasetIdFilesFileIdGet_notFound() { + void getDatasetFileById_notFound() { when(datasetFileApplicationService.getDatasetFile("dataset-id-1", "not-exist")) .thenThrow(new IllegalArgumentException("File not found")); - ResponseEntity response = controller.datasetsDatasetIdFilesFileIdGet( + ResponseEntity response = controller.getDatasetFileById( "dataset-id-1", "not-exist"); assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); @@ -204,10 +204,10 @@ void datasetsDatasetIdFilesFileIdGet_notFound() { @Test @DisplayName("datasetsDatasetIdFilesFileIdDelete: 正常删除文件") - void datasetsDatasetIdFilesFileIdDelete_success() { + void deleteDatasetFile_success() { doNothing().when(datasetFileApplicationService).deleteDatasetFile("dataset-id-1", "file-id-1"); - ResponseEntity response = controller.datasetsDatasetIdFilesFileIdDelete( + ResponseEntity response = controller.deleteDatasetFile( "dataset-id-1", "file-id-1"); assertEquals(HttpStatus.NO_CONTENT, response.getStatusCode()); @@ -216,11 +216,11 @@ void datasetsDatasetIdFilesFileIdDelete_success() { @Test @DisplayName("datasetsDatasetIdFilesFileIdDelete: 文件不存在时返回404") - void datasetsDatasetIdFilesFileIdDelete_notFound() { + void deleteDatasetFile_notFound() { doThrow(new IllegalArgumentException("File not found")) .when(datasetFileApplicationService).deleteDatasetFile("dataset-id-1", "not-exist"); - ResponseEntity response = controller.datasetsDatasetIdFilesFileIdDelete( + ResponseEntity response = controller.deleteDatasetFile( "dataset-id-1", "not-exist"); assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); @@ -228,14 +228,14 @@ void datasetsDatasetIdFilesFileIdDelete_notFound() { @Test @DisplayName("datasetsDatasetIdFilesFileIdDownloadGet: 正常下载文件") - void datasetsDatasetIdFilesFileIdDownloadGet_success() { + void downloadDatasetFile_success() { Resource resource = new ByteArrayResource("file content".getBytes()); when(datasetFileApplicationService.getDatasetFile("dataset-id-1", "file-id-1")) .thenReturn(sampleFile); when(datasetFileApplicationService.downloadFile("dataset-id-1", "file-id-1")) .thenReturn(resource); - ResponseEntity response = controller.datasetsDatasetIdFilesFileIdDownloadGet( + ResponseEntity response = controller.downloadDatasetFile( "dataset-id-1", "file-id-1"); assertEquals(HttpStatus.OK, response.getStatusCode()); @@ -250,11 +250,11 @@ void datasetsDatasetIdFilesFileIdDownloadGet_success() { @Test @DisplayName("datasetsDatasetIdFilesFileIdDownloadGet: 文件不存在时返回404") - void datasetsDatasetIdFilesFileIdDownloadGet_fileNotFound() { + void downloadDatasetIdFilesFileIdDownloadGet_fileNotFound() { when(datasetFileApplicationService.getDatasetFile("dataset-id-1", "not-exist")) .thenThrow(new IllegalArgumentException("File not found")); - ResponseEntity response = controller.datasetsDatasetIdFilesFileIdDownloadGet( + ResponseEntity response = controller.downloadDatasetFile( "dataset-id-1", "not-exist"); assertEquals(HttpStatus.NOT_FOUND, response.getStatusCode()); @@ -263,13 +263,13 @@ void datasetsDatasetIdFilesFileIdDownloadGet_fileNotFound() { @Test @DisplayName("datasetsDatasetIdFilesFileIdDownloadGet: 下载异常时返回500") - void datasetsDatasetIdFilesFileIdDownloadGet_downloadError() { + void downloadDatasetFileIdDownloadGet_downloadError() { when(datasetFileApplicationService.getDatasetFile("dataset-id-1", "file-id-1")) .thenReturn(sampleFile); when(datasetFileApplicationService.downloadFile("dataset-id-1", "file-id-1")) .thenThrow(new RuntimeException("Download error")); - ResponseEntity response = controller.datasetsDatasetIdFilesFileIdDownloadGet( + ResponseEntity response = controller.downloadDatasetFile( "dataset-id-1", "file-id-1"); assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode()); @@ -283,7 +283,7 @@ void convertToResponse_success() { when(datasetFileApplicationService.getDatasetFile("dataset-id-1", "file-id-1")) .thenReturn(sampleFile); - ResponseEntity response = controller.datasetsDatasetIdFilesFileIdGet( + ResponseEntity response = controller.getDatasetFileById( "dataset-id-1", "file-id-1"); DatasetFileResponse fileResponse = response.getBody(); @@ -310,7 +310,7 @@ void convertToResponse_nullValues() { when(datasetFileApplicationService.getDatasetFile("dataset-id-1", "minimal-file")) .thenReturn(minimalFile); - ResponseEntity response = controller.datasetsDatasetIdFilesFileIdGet( + ResponseEntity response = controller.getDatasetFileById( "dataset-id-1", "minimal-file"); DatasetFileResponse fileResponse = response.getBody(); @@ -334,7 +334,7 @@ void convertToResponse_statusConversionError() { when(datasetFileApplicationService.getDatasetFile("dataset-id-1", "invalid-status-file")) .thenReturn(fileWithInvalidStatus); - ResponseEntity response = controller.datasetsDatasetIdFilesFileIdGet( + ResponseEntity response = controller.getDatasetFileById( "dataset-id-1", "invalid-status-file"); DatasetFileResponse fileResponse = response.getBody(); diff --git a/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/interfaces/rest/DatasetTypeControllerTest.java b/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/interfaces/rest/DatasetTypeControllerTest.java index f30135d9d..4b42caeec 100644 --- a/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/interfaces/rest/DatasetTypeControllerTest.java +++ b/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/interfaces/rest/DatasetTypeControllerTest.java @@ -27,8 +27,8 @@ void setUp() { @Test @DisplayName("datasetTypesGet: 返回所有数据集类型") - void datasetTypesGet_success() { - ResponseEntity> response = controller.datasetTypesGet(); + void getDatasetTypes_success() { + ResponseEntity> response = controller.getDatasetTypes(); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getBody()); @@ -104,8 +104,8 @@ void datasetTypesGet_success() { @Test @DisplayName("datasetTypesGet: 验证返回的数据集类型顺序") - void datasetTypesGet_orderVerification() { - ResponseEntity> response = controller.datasetTypesGet(); + void getDatasetTypes_orderVerification() { + ResponseEntity> response = controller.getDatasetTypes(); List types = response.getBody(); assertNotNull(types); @@ -120,8 +120,8 @@ void datasetTypesGet_orderVerification() { @Test @DisplayName("datasetTypesGet: 验证每个类型都有必要属性") - void datasetTypesGet_requiredProperties() { - ResponseEntity> response = controller.datasetTypesGet(); + void getDatasetTypes_requiredProperties() { + ResponseEntity> response = controller.getDatasetTypes(); List types = response.getBody(); assertNotNull(types); @@ -141,8 +141,8 @@ void datasetTypesGet_requiredProperties() { @Test @DisplayName("datasetTypesGet: 验证支持的格式不为空") - void datasetTypesGet_supportedFormatsNotEmpty() { - ResponseEntity> response = controller.datasetTypesGet(); + void getDatasetTypes_supportedFormatsNotEmpty() { + ResponseEntity> response = controller.getDatasetTypes(); List types = response.getBody(); assertNotNull(types); @@ -150,7 +150,7 @@ void datasetTypesGet_supportedFormatsNotEmpty() { for (DatasetTypeResponse type : types) { assertNotNull(type.getSupportedFormats()); assertFalse(type.getSupportedFormats().isEmpty()); - + // 确保每个支持的格式都不为空字符串 for (String format : type.getSupportedFormats()) { assertNotNull(format); @@ -161,8 +161,8 @@ void datasetTypesGet_supportedFormatsNotEmpty() { @Test @DisplayName("datasetTypesGet: 验证图标映射") - void datasetTypesGet_iconMapping() { - ResponseEntity> response = controller.datasetTypesGet(); + void getDatasetTypes_iconMapping() { + ResponseEntity> response = controller.getDatasetTypes(); List types = response.getBody(); assertNotNull(types); @@ -196,8 +196,8 @@ void datasetTypesGet_iconMapping() { @Test @DisplayName("datasetTypesGet: 验证特定格式包含") - void datasetTypesGet_specificFormatInclusion() { - ResponseEntity> response = controller.datasetTypesGet(); + void getDatasetTypes_specificFormatInclusion() { + ResponseEntity> response = controller.getDatasetTypes(); List types = response.getBody(); assertNotNull(types); @@ -242,8 +242,8 @@ void datasetTypesGet_specificFormatInclusion() { @Test @DisplayName("datasetTypesGet: 返回响应状态正确") - void datasetTypesGet_responseStatus() { - ResponseEntity> response = controller.datasetTypesGet(); + void getDatasetTypes_responseStatus() { + ResponseEntity> response = controller.getDatasetTypes(); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getBody()); @@ -251,9 +251,9 @@ void datasetTypesGet_responseStatus() { @Test @DisplayName("datasetTypesGet: 多次调用返回一致结果") - void datasetTypesGet_consistentResults() { - ResponseEntity> response1 = controller.datasetTypesGet(); - ResponseEntity> response2 = controller.datasetTypesGet(); + void getDatasetTypes_consistentResults() { + ResponseEntity> response1 = controller.getDatasetTypes(); + ResponseEntity> response2 = controller.getDatasetTypes(); assertEquals(response1.getStatusCode(), response2.getStatusCode()); assertEquals(response1.getBody().size(), response2.getBody().size()); @@ -264,7 +264,7 @@ void datasetTypesGet_consistentResults() { for (int i = 0; i < types1.size(); i++) { DatasetTypeResponse type1 = types1.get(i); DatasetTypeResponse type2 = types2.get(i); - + assertEquals(type1.getCode(), type2.getCode()); assertEquals(type1.getName(), type2.getName()); assertEquals(type1.getDescription(), type2.getDescription()); diff --git a/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/interfaces/rest/TagControllerTest.java b/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/interfaces/rest/TagControllerTest.java index 2b9ba80b4..047a3221d 100644 --- a/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/interfaces/rest/TagControllerTest.java +++ b/backend/services/data-management-service/src/test/java/com/dataengine/datamanagement/interfaces/rest/TagControllerTest.java @@ -19,7 +19,6 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) @@ -45,13 +44,13 @@ void setUp() { @Test @DisplayName("tagsGet: 正常搜索标签") - void tagsGet_success() { + void getTags_success() { // Given List tags = Arrays.asList(sampleTag); when(tagApplicationService.searchTags("sample")).thenReturn(tags); // When - ResponseEntity> response = controller.tagsGet("sample"); + ResponseEntity> response = controller.getTags("sample"); // Then assertEquals(HttpStatus.OK, response.getStatusCode()); @@ -74,7 +73,7 @@ void tagsGet_allTags() { List allTags = Arrays.asList(sampleTag); when(tagApplicationService.searchTags(null)).thenReturn(allTags); - ResponseEntity> response = controller.tagsGet(null); + ResponseEntity> response = controller.getTags(null); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getBody()); @@ -84,10 +83,10 @@ void tagsGet_allTags() { @Test @DisplayName("tagsGet: 空结果集") - void tagsGet_emptyResult() { + void getTags_emptyResult() { when(tagApplicationService.searchTags("nonexistent")).thenReturn(Collections.emptyList()); - ResponseEntity> response = controller.tagsGet("nonexistent"); + ResponseEntity> response = controller.getTags("nonexistent"); assertEquals(HttpStatus.OK, response.getStatusCode()); assertNotNull(response.getBody()); @@ -97,7 +96,7 @@ void tagsGet_emptyResult() { @Test @DisplayName("tagsPost: 正常创建标签") - void tagsPost_success() { + void createTag_success() { // Given CreateTagRequest request = new CreateTagRequest(); request.setName("new-tag"); @@ -108,7 +107,7 @@ void tagsPost_success() { .thenReturn(sampleTag); // When - ResponseEntity response = controller.tagsPost(request); + ResponseEntity response = controller.createTag(request); // Then assertEquals(HttpStatus.CREATED, response.getStatusCode()); @@ -124,7 +123,7 @@ void tagsPost_success() { @Test @DisplayName("tagsPost: 标签名重复时返回400") - void tagsPost_duplicateName() { + void createTag_duplicateName() { CreateTagRequest request = new CreateTagRequest(); request.setName("duplicate-tag"); request.setColor("#0000ff"); @@ -133,7 +132,7 @@ void tagsPost_duplicateName() { when(tagApplicationService.createTag("duplicate-tag", "#0000ff", "Duplicate tag")) .thenThrow(new IllegalArgumentException("Tag already exists")); - ResponseEntity response = controller.tagsPost(request); + ResponseEntity response = controller.createTag(request); assertEquals(HttpStatus.BAD_REQUEST, response.getStatusCode()); assertNull(response.getBody()); @@ -142,7 +141,7 @@ void tagsPost_duplicateName() { @Test @DisplayName("tagsPost: 创建标签时处理null值") - void tagsPost_nullValues() { + void createTag_nullValues() { CreateTagRequest request = new CreateTagRequest(); request.setName("minimal-tag"); // color和description为null @@ -150,7 +149,7 @@ void tagsPost_nullValues() { when(tagApplicationService.createTag("minimal-tag", null, null)) .thenReturn(sampleTag); - ResponseEntity response = controller.tagsPost(request); + ResponseEntity response = controller.createTag(request); assertEquals(HttpStatus.CREATED, response.getStatusCode()); assertNotNull(response.getBody()); @@ -163,7 +162,7 @@ void convertToResponse_success() { // 通过public API间接测试convertToResponse方法 when(tagApplicationService.searchTags(null)).thenReturn(Arrays.asList(sampleTag)); - ResponseEntity> response = controller.tagsGet(null); + ResponseEntity> response = controller.getTags(null); TagResponse tagResponse = response.getBody().get(0); assertEquals("tag-id-1", tagResponse.getId()); @@ -183,7 +182,7 @@ void convertToResponse_nullUsageCount() { when(tagApplicationService.searchTags(null)).thenReturn(Arrays.asList(tagWithNullUsage)); - ResponseEntity> response = controller.tagsGet(null); + ResponseEntity> response = controller.getTags(null); TagResponse tagResponse = response.getBody().get(0); assertEquals("tag-id-2", tagResponse.getId()); @@ -206,7 +205,7 @@ void convertToResponse_multipleTags() { when(tagApplicationService.searchTags("multi")).thenReturn(Arrays.asList(tag1, tag2)); - ResponseEntity> response = controller.tagsGet("multi"); + ResponseEntity> response = controller.getTags("multi"); assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(2, response.getBody().size()); @@ -227,10 +226,10 @@ void convertToResponse_multipleTags() { @Test @DisplayName("tagsGet: 搜索关键词为空字符串") - void tagsGet_emptyKeyword() { + void getTags_emptyKeyword() { when(tagApplicationService.searchTags("")).thenReturn(Arrays.asList(sampleTag)); - ResponseEntity> response = controller.tagsGet(""); + ResponseEntity> response = controller.getTags(""); assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(1, response.getBody().size()); @@ -239,10 +238,10 @@ void tagsGet_emptyKeyword() { @Test @DisplayName("tagsGet: 搜索关键词为空白字符") - void tagsGet_blankKeyword() { + void getTags_blankKeyword() { when(tagApplicationService.searchTags(" ")).thenReturn(Arrays.asList(sampleTag)); - ResponseEntity> response = controller.tagsGet(" "); + ResponseEntity> response = controller.getTags(" "); assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(1, response.getBody().size()); From f50a2480205b657c3ba7729ab2410cb41a2c6c0a Mon Sep 17 00:00:00 2001 From: uname <2986773479@qq.com> Date: Tue, 30 Sep 2025 10:55:44 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feature:=E4=BF=AE=E6=94=B9sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/db/data-collection-init.sql | 29 +++++++++++++++++-- scripts/db/data-management-init.sql | 43 ++++++++++++++++++----------- 2 files changed, 54 insertions(+), 18 deletions(-) diff --git a/scripts/db/data-collection-init.sql b/scripts/db/data-collection-init.sql index badab916c..89585e7e3 100644 --- a/scripts/db/data-collection-init.sql +++ b/scripts/db/data-collection-init.sql @@ -1,7 +1,7 @@ -- 数据归集服务数据库初始化脚本 --- 适用于knowledge_base数据库 +-- 适用于dataengine数据库 -USE knowledge_base; +USE dataengine; -- ===================================== -- DDL语句 - 数据库表结构定义 @@ -12,6 +12,31 @@ DROP TABLE IF EXISTS t_dc_task_executions; DROP TABLE IF EXISTS t_dc_collection_tasks; DROP TABLE IF EXISTS t_dc_datax_templates; +CREATE TABLE t_dc_task_executions ( + id VARCHAR(36) PRIMARY KEY COMMENT '执行记录ID(UUID)', + task_id VARCHAR(36) NOT NULL COMMENT '任务ID', + task_name VARCHAR(255) NOT NULL COMMENT '任务名称', + status VARCHAR(20) DEFAULT 'RUNNING' COMMENT '执行状态:RUNNING/SUCCESS/FAILED/STOPPED', + progress DECIMAL(5,2) DEFAULT 0.00 COMMENT '进度百分比', + records_total BIGINT DEFAULT 0 COMMENT '总记录数', + records_processed BIGINT DEFAULT 0 COMMENT '已处理记录数', + records_success BIGINT DEFAULT 0 COMMENT '成功记录数', + records_failed BIGINT DEFAULT 0 COMMENT '失败记录数', + throughput DECIMAL(10,2) DEFAULT 0.00 COMMENT '吞吐量(条/秒)', + data_size_bytes BIGINT DEFAULT 0 COMMENT '数据量(字节)', + started_at TIMESTAMP NULL COMMENT '开始时间', + completed_at TIMESTAMP NULL COMMENT '完成时间', + duration_seconds INT DEFAULT 0 COMMENT '执行时长(秒)', + config JSON COMMENT '执行配置', + error_message TEXT COMMENT '错误信息', + datax_job_id TEXT COMMENT 'datax任务ID', + result TEXT COMMENT '执行结果', + created_at TIMESTAMP NULL COMMENT '创建时间', + INDEX idx_task_id (task_id), + INDEX idx_status (status), + INDEX idx_started_at (started_at) +) COMMENT='任务执行明细表'; + -- 数据归集任务表 CREATE TABLE t_dc_collection_tasks ( id VARCHAR(36) PRIMARY KEY COMMENT '任务ID(UUID)', diff --git a/scripts/db/data-management-init.sql b/scripts/db/data-management-init.sql index a73900f63..1821dd3ee 100644 --- a/scripts/db/data-management-init.sql +++ b/scripts/db/data-management-init.sql @@ -1,13 +1,24 @@ -- Data-Engine Platform 数据库初始化脚本 --- 适用于现有knowledge_base数据库环境 +-- 适用于现有dataengine数据库环境 --- 使用现有的knowledge_base数据库 -USE knowledge_base; +-- 使用现有的dataengine数据库 +USE dataengine; -- 删除已存在的表(如果需要重新创建) -- 原有表名保留,但本脚本新建以 t_dm_ 为前缀的新表,并使用 UUID 主键 -- 可按需手工迁移旧数据到新表 +CREATE TABLE IF NOT EXISTS t_data_sources ( + id VARCHAR(36) PRIMARY KEY COMMENT 'UUID', + name VARCHAR(255) NOT NULL COMMENT '数据源名称', + description TEXT COMMENT '数据源描述', + type VARCHAR(50) NOT NULL COMMENT '数据源类型', + host TEXT COMMENT '主机地址', + port TEXT COMMENT '端口', + database_name TEXT COMMENT '数据库名称', + username TEXT COMMENT '用户名', + enabled BOOLEAN DEFAULT FALSE COMMENT '是否启用' +) COMMENT='数据源表(UUID 主键)'; -- =========================================== -- 数据管理(Data Management)模块表(UUID 主键,t_dm_ 前缀) -- =========================================== @@ -19,7 +30,7 @@ CREATE TABLE IF NOT EXISTS t_dm_datasets ( description TEXT COMMENT '数据集描述', dataset_type VARCHAR(50) NOT NULL COMMENT '数据集类型:IMAGE/TEXT/QA/MULTIMODAL/OTHER', category VARCHAR(100) COMMENT '数据集分类:医学影像/问答/文献等', - data_source_id BIGINT COMMENT '关联数据源ID(保留为数值型)', + data_source_id VARCHAR(36) COMMENT '关联数据源ID(保留为数值型)', path VARCHAR(500) COMMENT '数据存储路径', format VARCHAR(50) COMMENT '数据格式:DCM/JPG/JSON/CSV等', schema_info JSON COMMENT '数据结构信息', @@ -40,7 +51,7 @@ CREATE TABLE IF NOT EXISTS t_dm_datasets ( updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', created_by VARCHAR(255) COMMENT '创建者', updated_by VARCHAR(255) COMMENT '更新者', - FOREIGN KEY (data_source_id) REFERENCES data_sources(id) ON DELETE SET NULL, + FOREIGN KEY (data_source_id) REFERENCES t_data_sources(id) ON DELETE SET NULL, INDEX idx_dm_dataset_type (dataset_type), INDEX idx_dm_category (category), INDEX idx_dm_data_source (data_source_id), @@ -120,7 +131,7 @@ CREATE TABLE IF NOT EXISTS t_dm_dataset_tags ( ) COMMENT='数据集标签关联表(UUID 外键)'; -- =========================================== --- 非数据管理表(如 users、data_sources)保持不变 +-- 非数据管理表(如 users、t_data_sources)保持不变 -- =========================================== -- 用户表(如果不存在) @@ -146,19 +157,19 @@ CREATE TABLE IF NOT EXISTS users ( -- 插入初始数据 -- 插入默认用户 -INSERT IGNORE INTO users (username, email, password_hash, full_name, role, organization) VALUES +INSERT IGNORE INTO users (username, email, password_hash, full_name, role, organization) VALUES ('admin', 'admin@dataengine.com', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7q7U3.XUO', '系统管理员', 'ADMIN', 'Data-Engine'), ('knowledge_user', 'knowledge@dataengine.com', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7q7U3.XUO', '知识库用户', 'USER', '三甲医院'); -- 插入默认数据源 -INSERT IGNORE INTO data_sources (name, description, type, host, port, database_name, username, enabled) VALUES +INSERT IGNORE INTO t_data_sources (name, description, type, host, port, database_name, username, enabled) VALUES ('知识库MySQL', '知识库MySQL数据库连接', 'MYSQL', 'localhost', 3306, 'knowledge_base', 'knowledge_user', TRUE), ('本地文件系统', '本地文件系统数据源', 'FILE_SYSTEM', NULL, NULL, NULL, NULL, TRUE), ('MinIO存储', 'MinIO对象存储服务', 'MINIO', 'localhost', 9000, NULL, 'admin', TRUE), ('医学影像PACS', 'PACS医学影像存储系统', 'PACS', 'pacs.hospital.com', 104, NULL, 'pacs_user', TRUE); -- 插入默认标签 -INSERT IGNORE INTO t_dm_tags (id, name, description, category, color) VALUES +INSERT IGNORE INTO t_dm_tags (id, name, description, category, color) VALUES ('0f3a0c2e-7b1d-4b8f-9e7a-1a2b3c4d5e6f', 'WSI', '全切片图像', '医学影像', '#FF6B6B'), ('1a2b3c4d-5e6f-7a8b-9c0d-1234567890ab', '病理', '病理学相关', '医学', '#4ECDC4'), ('2b3c4d5e-6f7a-8b9c-0d1e-234567890abc', '肺癌', '肺癌相关数据', '疾病', '#45B7D1'), @@ -171,7 +182,7 @@ INSERT IGNORE INTO t_dm_tags (id, name, description, category, color) VALUES ('9c0d1e2f-3a4b-5c6d-7e8f-90abcdef1234', '已验证', '已验证数据', '状态', '#85C1E9'); -- 插入示例数据集 -INSERT IGNORE INTO t_dm_datasets (id, name, description, dataset_type, category, data_source_id, format, file_count, record_count, completion_rate, quality_score, status, is_public, is_featured) VALUES +INSERT IGNORE INTO t_dm_datasets (id, name, description, dataset_type, category, data_source_id, format, file_count, record_count, completion_rate, quality_score, status, is_public, is_featured) VALUES ('11111111-1111-1111-1111-111111111111', '肺癌WSI病理图像数据集', '来自三甲医院的肺癌全切片病理图像,包含详细的病理标注信息', 'IMAGE', '医学影像', 1, 'WSI', 1247, 1205, 94.20, 96.80, 'ACTIVE', TRUE, TRUE), ('22222222-2222-2222-2222-222222222222', '肺癌WSI诊断数据集A', '基于肺癌WSI数据集生成的诊断数据集', 'IMAGE', '医学影像', 1, 'WSI', 850, 0, 0.00, 0.00, 'DRAFT', FALSE, FALSE), ('33333333-3333-3333-3333-333333333333', '肺癌WSI诊断数据集B', '基于肺癌WSI数据集生成的诊断数据集', 'IMAGE', '医学影像', 1, 'WSI', 650, 0, 0.00, 0.00, 'DRAFT', FALSE, FALSE), @@ -180,7 +191,7 @@ INSERT IGNORE INTO t_dm_datasets (id, name, description, dataset_type, category, ('66666666-6666-6666-6666-666666666666', 'GSM8K数学推理数据集', '包含小学数学应用题的推理数据集,并开展数学推理能力训练', 'TEXT', '数学', 1, 'JSON', 8500, 8500, 96.00, 96.00, 'ACTIVE', FALSE, FALSE); -- 插入数据集标签关联 -INSERT IGNORE INTO t_dm_dataset_tags (dataset_id, tag_id) VALUES +INSERT IGNORE INTO t_dm_dataset_tags (dataset_id, tag_id) VALUES ('11111111-1111-1111-1111-111111111111', '0f3a0c2e-7b1d-4b8f-9e7a-1a2b3c4d5e6f'), ('11111111-1111-1111-1111-111111111111', '1a2b3c4d-5e6f-7a8b-9c0d-1234567890ab'), ('11111111-1111-1111-1111-111111111111', '2b3c4d5e-6f7a-8b9c-0d1e-234567890abc'), ('11111111-1111-1111-1111-111111111111', '4d5e6f7a-8b9c-0d1e-2f3a-4567890abcde'), ('11111111-1111-1111-1111-111111111111', '8b9c0d1e-2f3a-4b5c-6d7e-890abcdef123'), ('11111111-1111-1111-1111-111111111111', '9c0d1e2f-3a4b-5c6d-7e8f-90abcdef1234'), ('22222222-2222-2222-2222-222222222222', '0f3a0c2e-7b1d-4b8f-9e7a-1a2b3c4d5e6f'), ('22222222-2222-2222-2222-222222222222', '1a2b3c4d-5e6f-7a8b-9c0d-1234567890ab'), ('22222222-2222-2222-2222-222222222222', '2b3c4d5e-6f7a-8b9c-0d1e-234567890abc'), ('22222222-2222-2222-2222-222222222222', '4d5e6f7a-8b9c-0d1e-2f3a-4567890abcde'), ('33333333-3333-3333-3333-333333333333', '0f3a0c2e-7b1d-4b8f-9e7a-1a2b3c4d5e6f'), ('33333333-3333-3333-3333-333333333333', '1a2b3c4d-5e6f-7a8b-9c0d-1234567890ab'), ('33333333-3333-3333-3333-333333333333', '2b3c4d5e-6f7a-8b9c-0d1e-234567890abc'), ('33333333-3333-3333-3333-333333333333', '4d5e6f7a-8b9c-0d1e-2f3a-4567890abcde'), @@ -193,7 +204,7 @@ SET @F1 = 'aaaabbbb-0001-0001-0001-aaaabbbb0001'; SET @F2 = 'aaaabbbb-0002-0002-0002-aaaabbbb0002'; SET @F3 = 'aaaabbbb-0003-0003-0003-aaaabbbb0003'; SET @F4 = 'aaaabbbb-0004-0004-0004-aaaabbbb0004'; -INSERT IGNORE INTO t_dm_dataset_files (id, dataset_id, file_name, file_path, file_type, file_format, file_size, status) VALUES +INSERT IGNORE INTO t_dm_dataset_files (id, dataset_id, file_name, file_path, file_type, file_format, file_size, status) VALUES (@F1, '11111111-1111-1111-1111-111111111111', 'lung_cancer_001.jpg', '/datasets/wsi/lung_cancer_001.jpg', 'IMAGE', 'JPG', 2516582, 'ACTIVE'), (@F2, '11111111-1111-1111-1111-111111111111', 'lung_cancer_002.jpg', '/datasets/wsi/lung_cancer_002.jpg', 'IMAGE', 'JPG', 1887437, 'ACTIVE'), (@F3, '11111111-1111-1111-1111-111111111111', 'pathology_report_001.txt', '/datasets/wsi/pathology_report_001.txt', 'TEXT', 'TXT', 15360, 'ACTIVE'), @@ -204,7 +215,7 @@ SET @S1 = 'bbbbcccc-1001-1001-1001-bbbbcccc1001'; SET @S2 = 'bbbbcccc-1002-1002-1002-bbbbcccc1002'; SET @S3 = 'bbbbcccc-1003-1003-1003-bbbbcccc1003'; SET @S4 = 'bbbbcccc-1004-1004-1004-bbbbcccc1004'; -INSERT IGNORE INTO t_dm_dataset_statistics (id, dataset_id, stat_date, total_files, total_size, processed_files, error_files, download_count, view_count) VALUES +INSERT IGNORE INTO t_dm_dataset_statistics (id, dataset_id, stat_date, total_files, total_size, processed_files, error_files, download_count, view_count) VALUES (@S1, '11111111-1111-1111-1111-111111111111', CURDATE(), 1247, 1342177280, 1205, 15, 0, 0), (@S2, '44444444-4444-4444-4444-444444444444', CURDATE(), 50000, 943718400, 50000, 0, 0, 0), (@S3, '55555555-5555-5555-5555-555555555555', CURDATE(), 100000, 2516582400, 95000, 0, 0, 0), @@ -214,7 +225,7 @@ COMMIT; -- 创建视图:数据集详情视图(引用新表) CREATE OR REPLACE VIEW v_dm_dataset_details AS -SELECT +SELECT d.id, d.name, d.description, @@ -238,7 +249,7 @@ SELECT COALESCE(stats.total_size, 0) as total_size_bytes, GROUP_CONCAT(t.name ORDER BY t.name SEPARATOR ', ') as tag_names FROM t_dm_datasets d -LEFT JOIN data_sources ds ON d.data_source_id = ds.id +LEFT JOIN t_data_sources ds ON d.data_source_id = ds.id LEFT JOIN t_dm_dataset_statistics stats ON d.id = stats.dataset_id AND stats.stat_date = CURDATE() LEFT JOIN t_dm_dataset_tags dt ON d.id = dt.dataset_id LEFT JOIN t_dm_tags t ON dt.tag_id = t.id @@ -246,7 +257,7 @@ GROUP BY d.id, ds.name, ds.type, stats.total_size; -- 创建视图:数据集统计摘要(引用新表) CREATE OR REPLACE VIEW v_dm_dataset_summary AS -SELECT +SELECT COUNT(*) as total_datasets, SUM(CASE WHEN status = 'ACTIVE' THEN 1 ELSE 0 END) as active_datasets, SUM(CASE WHEN is_public = TRUE THEN 1 ELSE 0 END) as public_datasets,