From 394e2bda18b2504507bced4f42127aeec5e37e1a Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Wed, 4 Feb 2026 16:25:03 +0800 Subject: [PATCH] =?UTF-8?q?feat(data-management):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=96=87=E4=BB=B6=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在OpenAPI规范中定义了取消上传的REST端点接口 - 实现了DatasetFileApplicationService中的取消上传业务逻辑 - 在FileService中添加了完整的取消上传服务方法 - 创建了DatasetUploadController控制器处理取消上传请求 - 实现了临时分片文件清理和数据库记录删除功能 --- backend/openapi/specs/data-management.yaml | 47 +++++++++++++------ .../DatasetFileApplicationService.java | 18 +++++-- .../rest/DatasetUploadController.java | 33 +++++++++++++ .../common/domain/service/FileService.java | 20 ++++++++ 4 files changed, 98 insertions(+), 20 deletions(-) create mode 100644 backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/rest/DatasetUploadController.java diff --git a/backend/openapi/specs/data-management.yaml b/backend/openapi/specs/data-management.yaml index 81c9531..f22d7b3 100644 --- a/backend/openapi/specs/data-management.yaml +++ b/backend/openapi/specs/data-management.yaml @@ -447,12 +447,12 @@ paths: schema: type: string - /data-management/datasets/{datasetId}/files/upload/chunk: - post: - tags: [ DatasetFile ] - operationId: chunkUpload - summary: 切片上传 - description: 使用预上传返回的请求ID进行分片上传 + /data-management/datasets/{datasetId}/files/upload/chunk: + post: + tags: [ DatasetFile ] + operationId: chunkUpload + summary: 切片上传 + description: 使用预上传返回的请求ID进行分片上传 parameters: - name: datasetId in: path @@ -466,15 +466,32 @@ paths: multipart/form-data: schema: $ref: '#/components/schemas/UploadFileRequest' - responses: - '200': - description: 上传成功 - - /data-management/dataset-types: - get: - operationId: getDatasetTypes - tags: [DatasetType] - summary: 获取数据集类型列表 + responses: + '200': + description: 上传成功 + + /data-management/datasets/upload/cancel-upload/{reqId}: + put: + tags: [ DatasetFile ] + operationId: cancelUpload + summary: 取消上传 + description: 取消预上传请求并清理临时分片 + parameters: + - name: reqId + in: path + required: true + schema: + type: string + description: 预上传请求ID + responses: + '200': + description: 取消成功 + + /data-management/dataset-types: + get: + operationId: getDatasetTypes + tags: [DatasetType] + summary: 获取数据集类型列表 description: 获取所有支持的数据集类型 responses: '200': diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java index b8bfa44..7920838 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetFileApplicationService.java @@ -499,11 +499,19 @@ public class DatasetFileApplicationService { * * @param uploadFileRequest 上传请求 */ - @Transactional - public void chunkUpload(String datasetId, UploadFileRequest uploadFileRequest) { - FileUploadResult uploadResult = fileService.chunkUpload(DatasetConverter.INSTANCE.toChunkUploadRequest(uploadFileRequest)); - saveFileInfoToDb(uploadResult, datasetId); - } + @Transactional + public void chunkUpload(String datasetId, UploadFileRequest uploadFileRequest) { + FileUploadResult uploadResult = fileService.chunkUpload(DatasetConverter.INSTANCE.toChunkUploadRequest(uploadFileRequest)); + saveFileInfoToDb(uploadResult, datasetId); + } + + /** + * 取消上传 + */ + @Transactional + public void cancelUpload(String reqId) { + fileService.cancelUpload(reqId); + } private void saveFileInfoToDb(FileUploadResult fileUploadResult, String datasetId) { if (Objects.isNull(fileUploadResult.getSavedFile())) { diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/rest/DatasetUploadController.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/rest/DatasetUploadController.java new file mode 100644 index 0000000..3f5b214 --- /dev/null +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/rest/DatasetUploadController.java @@ -0,0 +1,33 @@ +package com.datamate.datamanagement.interfaces.rest; + +import com.datamate.datamanagement.application.DatasetFileApplicationService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * 数据集上传控制器 + */ +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/data-management/datasets/upload") +public class DatasetUploadController { + + private final DatasetFileApplicationService datasetFileApplicationService; + + /** + * 取消上传 + * + * @param reqId 预上传请求ID + */ + @PutMapping("/cancel-upload/{reqId}") + public ResponseEntity cancelUpload(@PathVariable("reqId") String reqId) { + datasetFileApplicationService.cancelUpload(reqId); + return ResponseEntity.ok().build(); + } +} diff --git a/backend/shared/domain-common/src/main/java/com/datamate/common/domain/service/FileService.java b/backend/shared/domain-common/src/main/java/com/datamate/common/domain/service/FileService.java index 1c4fcb2..7a4bea3 100644 --- a/backend/shared/domain-common/src/main/java/com/datamate/common/domain/service/FileService.java +++ b/backend/shared/domain-common/src/main/java/com/datamate/common/domain/service/FileService.java @@ -74,6 +74,26 @@ public class FileService { .build(); } + /** + * 取消上传 + */ + @Transactional + public void cancelUpload(String reqId) { + if (reqId == null || reqId.isBlank()) { + throw BusinessException.of(CommonErrorCode.PARAM_ERROR); + } + ChunkUploadPreRequest preRequest = chunkUploadRequestMapper.findById(reqId); + if (preRequest == null) { + return; + } + String uploadPath = preRequest.getUploadPath(); + if (uploadPath != null && !uploadPath.isBlank()) { + File tempDir = new File(uploadPath, String.format(ChunksSaver.TEMP_DIR_NAME_FORMAT, preRequest.getId())); + ChunksSaver.deleteFolder(tempDir.getPath()); + } + chunkUploadRequestMapper.deleteById(reqId); + } + private File uploadFile(ChunkUploadRequest fileUploadRequest, ChunkUploadPreRequest preRequest) { File savedFile = ChunksSaver.saveFile(fileUploadRequest, preRequest); preRequest.setTimeout(LocalDateTime.now().plusSeconds(DEFAULT_TIMEOUT));