Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions backend/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
<mapstruct.version>1.6.3</mapstruct.version>
<lombok.version>1.18.32</lombok.version>
<lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
<poi.version>5.4.0</poi.version>
</properties>

<modules>
Expand Down Expand Up @@ -132,6 +133,12 @@
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
</dependencies>
</dependencyManagement>

Expand Down Expand Up @@ -165,6 +172,12 @@
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>${poi.version}</version>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,23 +1,26 @@
package com.dataengine.datamanagement.application.service;

import com.dataengine.datamanagement.domain.model.dataset.Dataset;
import com.dataengine.datamanagement.domain.model.dataset.StatusConstants;
import com.dataengine.datamanagement.domain.model.dataset.Tag;
import com.dataengine.datamanagement.infrastructure.persistence.mapper.DatasetFileMapper;
import com.dataengine.datamanagement.infrastructure.persistence.mapper.DatasetMapper;
import com.dataengine.datamanagement.infrastructure.persistence.mapper.TagMapper;
import com.dataengine.datamanagement.interfaces.converter.DatasetConverter;
import com.dataengine.datamanagement.interfaces.dto.AllDatasetStatisticsResponse;
import com.dataengine.datamanagement.interfaces.dto.CreateDatasetRequest;
import com.dataengine.datamanagement.interfaces.dto.DatasetPagingQuery;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;

/**
* 数据集应用服务(对齐 DB schema,使用 UUID 字符串主键)
Expand All @@ -30,6 +33,9 @@ public class DatasetApplicationService {
private final TagMapper tagMapper;
private final DatasetFileMapper datasetFileMapper;

@Value("${dataset.base.path:/dataset}")
private String datasetBasePath;

@Autowired
public DatasetApplicationService(DatasetMapper datasetMapper, TagMapper tagMapper, DatasetFileMapper datasetFileMapper) {
this.datasetMapper = datasetMapper;
Expand All @@ -40,32 +46,21 @@ public DatasetApplicationService(DatasetMapper datasetMapper, TagMapper tagMappe
/**
* 创建数据集
*/
public Dataset createDataset(String name, String description, String datasetType,
List<String> tagNames, Long dataSourceId,
String path, String format, String createdBy) {
if (datasetMapper.findByName(name) != null) {
throw new IllegalArgumentException("Dataset with name '" + name + "' already exists");
@Transactional
public Dataset createDataset(CreateDatasetRequest createDatasetRequest) {
if (datasetMapper.findByName(createDatasetRequest.getName()) != null) {
throw new IllegalArgumentException("Dataset with name '" + createDatasetRequest.getName() + "' already exists");
}

Dataset dataset = new Dataset();
dataset.setId(UUID.randomUUID().toString());
dataset.setName(name);
dataset.setDescription(description);
dataset.setDatasetType(datasetType);
dataset.setDataSourceId(dataSourceId);
dataset.setPath(path);
dataset.setFormat(format);
dataset.setStatus(StatusConstants.DatasetStatuses.ACTIVE);
dataset.setCreatedBy(createdBy);
dataset.setUpdatedBy(createdBy);
dataset.setCreatedAt(LocalDateTime.now());
dataset.setUpdatedAt(LocalDateTime.now());
datasetMapper.insert(dataset); // 手动设定 UUID 主键
// 创建数据集对象
Dataset dataset = DatasetConverter.INSTANCE.convertToDataset(createDatasetRequest);
dataset.initCreateParam(datasetBasePath);
datasetMapper.insert(dataset);

// 处理标签
Set<Tag> processedTags = new HashSet<>();
if (tagNames != null && !tagNames.isEmpty()) {
processedTags = processTagNames(tagNames);
if (CollectionUtils.isNotEmpty(createDatasetRequest.getTags())) {
processedTags = processTagNames(createDatasetRequest.getTags());
for (Tag t : processedTags) {
tagMapper.insertDatasetTag(dataset.getId(), t.getId());
}
Expand Down Expand Up @@ -150,23 +145,21 @@ public Dataset getDataset(String datasetId) {
* 分页查询数据集
*/
@Transactional(readOnly = true)
public Page<Dataset> getDatasets(String typeCode, String status, String keyword,
List<String> tagNames, Pageable pageable) {
RowBounds bounds = new RowBounds(pageable.getPageNumber() * pageable.getPageSize(), pageable.getPageSize());
List<Dataset> content = datasetMapper.findByCriteria(typeCode, status, keyword, tagNames, bounds);
public Page<Dataset> getDatasets(DatasetPagingQuery query) {
RowBounds bounds = new RowBounds(query.getPage() * query.getSize(), query.getSize());
List<Dataset> content = datasetMapper.findByCriteria(query.getType(), query.getStatus(), query.getKeyword(), query.getTagList(), bounds);
long total = datasetMapper.countByCriteria(query.getType(), query.getStatus(), query.getKeyword(), query.getTagList());

// 为每个数据集填充标签信息
if (content != null && !content.isEmpty()) {
if (CollectionUtils.isNotEmpty(content)) {
for (Dataset dataset : content) {
List<Tag> tags = tagMapper.findByDatasetId(dataset.getId());
if (tags != null) {
dataset.getTags().addAll(tags);
}
}
}

long total = datasetMapper.countByCriteria(typeCode, status, keyword, tagNames);
return new PageImpl<>(content, pageable, total);
return new PageImpl<>(content, PageRequest.of(query.getPage(), query.getSize()), total);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
package com.dataengine.datamanagement.application.service;

import com.dataengine.common.domain.model.ChunkUploadPreRequest;
import com.dataengine.common.domain.model.FileUploadResult;
import com.dataengine.common.domain.service.FileService;
import com.dataengine.common.domain.utils.AnalyzerUtils;
import com.dataengine.datamanagement.domain.contants.DatasetConstant;
import com.dataengine.datamanagement.domain.model.dataset.Dataset;
import com.dataengine.datamanagement.domain.model.dataset.DatasetFile;
import com.dataengine.datamanagement.domain.model.dataset.DatasetFileUploadCheckInfo;
import com.dataengine.datamanagement.domain.model.dataset.StatusConstants;
import com.dataengine.datamanagement.infrastructure.persistence.mapper.DatasetFileMapper;
import com.dataengine.datamanagement.infrastructure.persistence.mapper.DatasetMapper;
import com.dataengine.datamanagement.interfaces.converter.DatasetConverter;
import com.dataengine.datamanagement.interfaces.dto.UploadFileRequest;
import com.dataengine.datamanagement.interfaces.dto.UploadFilesPreRequest;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
Expand All @@ -17,6 +28,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.nio.file.Files;
Expand All @@ -25,6 +37,7 @@
import java.nio.file.StandardCopyOption;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.UUID;

/**
Expand All @@ -37,14 +50,19 @@ public class DatasetFileApplicationService {
private final DatasetFileMapper datasetFileMapper;
private final DatasetMapper datasetMapper;
private final Path fileStorageLocation;
private final FileService fileService;

@Value("${dataset.base.path:/dataset}")
private String datasetBasePath;

@Autowired
public DatasetFileApplicationService(DatasetFileMapper datasetFileMapper,
DatasetMapper datasetMapper,
DatasetMapper datasetMapper, FileService fileService,
@Value("${app.file.upload-dir:./uploads}") String uploadDir) {
this.datasetFileMapper = datasetFileMapper;
this.datasetMapper = datasetMapper;
this.fileStorageLocation = Paths.get(uploadDir).toAbsolutePath().normalize();
this.fileService = fileService;
try {
Files.createDirectories(this.fileStorageLocation);
} catch (Exception ex) {
Expand Down Expand Up @@ -170,4 +188,65 @@ private String getFileExtension(String fileName) {
}
return fileName.substring(lastDotIndex + 1);
}

/**
* 预上传
*
* @param chunkUploadRequest 上传请求
* @param datasetId 数据集id
* @return 请求id
*/
@Transactional
public String preUpload(UploadFilesPreRequest chunkUploadRequest, String datasetId) {
ChunkUploadPreRequest request = ChunkUploadPreRequest.builder().build();
request.setUploadPath(datasetBasePath + File.separator + datasetId);
request.setTotalFileNum(chunkUploadRequest.getTotalFileNum());
request.setServiceId(DatasetConstant.SERVICE_ID);
DatasetFileUploadCheckInfo checkInfo = new DatasetFileUploadCheckInfo();
checkInfo.setDatasetId(datasetId);
checkInfo.setHasArchive(chunkUploadRequest.isHasArchive());
try {
ObjectMapper objectMapper = new ObjectMapper();
String checkInfoJson = objectMapper.writeValueAsString(checkInfo);
request.setCheckInfo(checkInfoJson);
} catch (JsonProcessingException e) {
throw new IllegalArgumentException("Failed to serialize checkInfo to JSON", e);
}
return fileService.preUpload(request);
}

/**
* 切片上传
*
* @param uploadFileRequest 上传请求
*/
public void chunkUpload(String datasetId, UploadFileRequest uploadFileRequest) {
FileUploadResult uploadResult = fileService.chunkUpload(DatasetConverter.INSTANCE.toChunkUploadRequest(uploadFileRequest));
saveFileInfoToDb(uploadResult, uploadFileRequest, datasetId);
if (uploadResult.isAllFilesUploaded()) {
// 解析文件,后续依据需求看是否添加校验文件元数据和解析半结构化文件的逻辑,
}
}

private void saveFileInfoToDb(FileUploadResult fileUploadResult, UploadFileRequest uploadFile, String datasetId) {
if (Objects.isNull(fileUploadResult.getSavedFile())) {
// 文件切片上传没有完成
return;
}
File savedFile = fileUploadResult.getSavedFile();
LocalDateTime currentTime = LocalDateTime.now();
DatasetFile datasetFile = DatasetFile.builder()
.id(UUID.randomUUID().toString())
.datasetId(datasetId)
.fileSize(savedFile.length())
.uploadTime(currentTime)
.lastAccessTime(currentTime)
.lastAccessTime(currentTime)
.fileName(uploadFile.getFileName())
.filePath(savedFile.getPath())
.fileType(AnalyzerUtils.getExtension(uploadFile.getFileName()))
.build();

datasetFileMapper.insert(datasetFile);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.dataengine.datamanagement.domain.contants;

/**
* 数据集常量
*/
public interface DatasetConstant {
/**
* 服务ID
*/
String SERVICE_ID = "DATA_MANAGEMENT";
}
Loading