Skip to content

Commit 60bd453

Browse files
committed
fix: 数据管理接口
1 parent 6f852fc commit 60bd453

File tree

17 files changed

+258
-243
lines changed

17 files changed

+258
-243
lines changed

backend/pom.xml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,11 @@
106106
</dependency>
107107
<!-- MyBatis version alignment -->
108108
<dependency>
109-
<groupId>com.baomidou</groupId>
110-
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
111-
<version>${mybatis-plus.version}</version>
109+
<groupId>com.baomidou</groupId>
110+
<artifactId>mybatis-plus-bom</artifactId>
111+
<version>${mybatis-plus.version}</version>
112+
<type>pom</type>
113+
<scope>import</scope>
112114
</dependency>
113115

114116
<dependency>
@@ -167,6 +169,10 @@
167169
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
168170
<version>${mybatis-plus.version}</version>
169171
</dependency>
172+
<dependency>
173+
<groupId>com.baomidou</groupId>
174+
<artifactId>mybatis-plus-jsqlparser</artifactId>
175+
</dependency>
170176

171177
<!-- Log4j2 API -->
172178
<dependency>

backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/application/DatasetApplicationService.java

Lines changed: 40 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,31 @@
11
package com.dataengine.datamanagement.application;
22

3-
import com.dataengine.datamanagement.common.enums.DatasetStatusType;
3+
import com.baomidou.mybatisplus.core.metadata.IPage;
4+
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
5+
import com.dataengine.common.infrastructure.exception.BusinessAssert;
6+
import com.dataengine.common.interfaces.PagedResponse;
47
import com.dataengine.datamanagement.domain.model.dataset.Dataset;
58
import com.dataengine.datamanagement.domain.model.dataset.DatasetFile;
69
import com.dataengine.datamanagement.domain.model.dataset.Tag;
710
import com.dataengine.datamanagement.infrastructure.client.CollectionTaskClient;
811
import com.dataengine.datamanagement.infrastructure.client.dto.CollectionTaskDetailResponse;
912
import com.dataengine.datamanagement.infrastructure.client.dto.LocalCollectionConfig;
13+
import com.dataengine.datamanagement.infrastructure.exception.DataManagementErrorCode;
1014
import com.dataengine.datamanagement.infrastructure.persistence.mapper.TagMapper;
1115
import com.dataengine.datamanagement.infrastructure.persistence.repository.DatasetFileRepository;
1216
import com.dataengine.datamanagement.infrastructure.persistence.repository.DatasetRepository;
1317
import com.dataengine.datamanagement.interfaces.converter.DatasetConverter;
14-
import com.dataengine.datamanagement.interfaces.dto.AllDatasetStatisticsResponse;
15-
import com.dataengine.datamanagement.interfaces.dto.CreateDatasetRequest;
16-
import com.dataengine.datamanagement.interfaces.dto.DatasetPagingQuery;
18+
import com.dataengine.datamanagement.interfaces.dto.*;
1719
import com.fasterxml.jackson.databind.ObjectMapper;
20+
import lombok.RequiredArgsConstructor;
1821
import lombok.extern.slf4j.Slf4j;
1922
import org.apache.commons.collections4.CollectionUtils;
20-
import org.apache.commons.lang3.StringUtils;
21-
import org.apache.ibatis.session.RowBounds;
22-
import org.springframework.beans.factory.annotation.Autowired;
2323
import org.springframework.beans.factory.annotation.Value;
24-
import org.springframework.data.domain.Page;
25-
import org.springframework.data.domain.PageImpl;
26-
import org.springframework.data.domain.PageRequest;
2724
import org.springframework.scheduling.annotation.Async;
2825
import org.springframework.stereotype.Service;
2926
import org.springframework.transaction.annotation.Transactional;
27+
import org.springframework.util.StringUtils;
3028

31-
import java.time.LocalDateTime;
3229
import java.util.*;
3330
import java.util.function.Function;
3431
import java.util.stream.Collectors;
@@ -39,8 +36,8 @@
3936
@Slf4j
4037
@Service
4138
@Transactional
39+
@RequiredArgsConstructor
4240
public class DatasetApplicationService {
43-
4441
private final DatasetRepository datasetRepository;
4542
private final TagMapper tagMapper;
4643
private final DatasetFileRepository datasetFileRepository;
@@ -51,104 +48,54 @@ public class DatasetApplicationService {
5148
@Value("${dataset.base.path:/dataset}")
5249
private String datasetBasePath;
5350

54-
@Autowired
55-
public DatasetApplicationService(DatasetRepository datasetRepository,
56-
TagMapper tagMapper,
57-
DatasetFileRepository datasetFileRepository,
58-
CollectionTaskClient collectionTaskClient,
59-
FileMetadataService fileMetadataService,
60-
ObjectMapper objectMapper) {
61-
this.datasetRepository = datasetRepository;
62-
this.tagMapper = tagMapper;
63-
this.datasetFileRepository = datasetFileRepository;
64-
this.collectionTaskClient = collectionTaskClient;
65-
this.fileMetadataService = fileMetadataService;
66-
this.objectMapper = objectMapper;
67-
}
68-
6951
/**
7052
* 创建数据集
7153
*/
7254
@Transactional
7355
public Dataset createDataset(CreateDatasetRequest createDatasetRequest) {
74-
if (datasetRepository.findByName(createDatasetRequest.getName()) != null) {
75-
throw new IllegalArgumentException("Dataset with name '" + createDatasetRequest.getName() + "' already exists");
76-
}
77-
56+
BusinessAssert.isTrue(datasetRepository.findByName(createDatasetRequest.getName()) == null, DataManagementErrorCode.DATASET_ALREADY_EXISTS);
7857
// 创建数据集对象
7958
Dataset dataset = DatasetConverter.INSTANCE.convertToDataset(createDatasetRequest);
8059
dataset.initCreateParam(datasetBasePath);
81-
datasetRepository.save(dataset);
82-
8360
// 处理标签
84-
Set<Tag> processedTags = new HashSet<>();
85-
if (CollectionUtils.isNotEmpty(createDatasetRequest.getTags())) {
86-
processedTags = processTagNames(createDatasetRequest.getTags());
87-
for (Tag t : processedTags) {
88-
tagMapper.insertDatasetTag(dataset.getId(), t.getId());
89-
}
90-
}
61+
Set<Tag> processedTags = Optional.ofNullable(createDatasetRequest.getTags())
62+
.filter(CollectionUtils::isNotEmpty)
63+
.map(this::processTagNames)
64+
.orElseGet(HashSet::new);
65+
dataset.setTags(processedTags);
66+
datasetRepository.save(dataset);
9167

92-
if (StringUtils.isNotBlank(createDatasetRequest.getDataSource())) {
68+
//todo 需要解耦这块逻辑
69+
if (StringUtils.hasText(createDatasetRequest.getDataSource())) {
9370
// 数据源id不为空,使用异步线程进行文件扫盘落库
9471
processDataSourceAsync(dataset.getId(), createDatasetRequest.getDataSource());
9572
}
96-
97-
// 返回创建的数据集,包含标签信息
98-
Dataset createdDataset = datasetRepository.getById(dataset.getId());
99-
createdDataset.getTags().addAll(processedTags);
100-
return createdDataset;
73+
return dataset;
10174
}
10275

103-
/**
104-
* 更新数据集
105-
*/
106-
public Dataset updateDataset(String datasetId, String name, String description,
107-
List<String> tagNames, String status) {
76+
public Dataset updateDataset(String datasetId, UpdateDatasetRequest updateDatasetRequest) {
10877
Dataset dataset = datasetRepository.getById(datasetId);
109-
if (dataset == null) {
110-
throw new IllegalArgumentException("Dataset not found: " + datasetId);
78+
BusinessAssert.notNull(dataset, DataManagementErrorCode.DATASET_NOT_FOUND);
79+
if (StringUtils.hasText(updateDatasetRequest.getName())) {
80+
dataset.setName(updateDatasetRequest.getName());
11181
}
112-
113-
if (name != null && !name.isEmpty()) dataset.setName(name);
114-
if (description != null) dataset.setDescription(description);
115-
if (status != null && !status.isEmpty()) dataset.setStatus(DatasetStatusType.valueOf(status));
116-
dataset.setUpdatedAt(LocalDateTime.now());
117-
118-
Set<Tag> processedTags = new HashSet<>();
119-
if (tagNames != null) {
120-
tagMapper.deleteDatasetTagsByDatasetId(datasetId);
121-
if (!tagNames.isEmpty()) {
122-
processedTags = processTagNames(tagNames);
123-
for (Tag t : processedTags) {
124-
tagMapper.insertDatasetTag(datasetId, t.getId());
125-
}
126-
}
127-
} else {
128-
// 如果没有传入标签参数,保持原有标签
129-
List<Tag> existingTags = tagMapper.findByDatasetId(datasetId);
130-
if (existingTags != null) {
131-
processedTags.addAll(existingTags);
132-
}
82+
if (StringUtils.hasText(updateDatasetRequest.getDescription())) {
83+
dataset.setDescription(updateDatasetRequest.getDescription());
84+
}
85+
if (CollectionUtils.isNotEmpty(updateDatasetRequest.getTags())) {
86+
dataset.setTags(processTagNames(updateDatasetRequest.getTags()));
87+
}
88+
if (Objects.nonNull(updateDatasetRequest.getStatus())) {
89+
dataset.setStatus(updateDatasetRequest.getStatus());
13390
}
134-
13591
datasetRepository.updateById(dataset);
136-
137-
// 返回更新后的数据集,包含标签信息
138-
Dataset updatedDataset = datasetRepository.getById(datasetId);
139-
updatedDataset.getTags().addAll(processedTags);
140-
return updatedDataset;
92+
return dataset;
14193
}
14294

14395
/**
14496
* 删除数据集
14597
*/
14698
public void deleteDataset(String datasetId) {
147-
Dataset dataset = datasetRepository.getById(datasetId);
148-
if (dataset == null) {
149-
throw new IllegalArgumentException("Dataset not found: " + datasetId);
150-
}
151-
tagMapper.deleteDatasetTagsByDatasetId(datasetId);
15299
datasetRepository.removeById(datasetId);
153100
}
154101

@@ -158,36 +105,18 @@ public void deleteDataset(String datasetId) {
158105
@Transactional(readOnly = true)
159106
public Dataset getDataset(String datasetId) {
160107
Dataset dataset = datasetRepository.getById(datasetId);
161-
if (dataset == null) {
162-
throw new IllegalArgumentException("Dataset not found: " + datasetId);
163-
}
164-
// 载入标签
165-
List<Tag> tags = tagMapper.findByDatasetId(datasetId);
166-
if (tags != null) {
167-
dataset.getTags().addAll(tags);
168-
}
108+
BusinessAssert.notNull(dataset, DataManagementErrorCode.DATASET_NOT_FOUND);
169109
return dataset;
170110
}
171111

172112
/**
173113
* 分页查询数据集
174114
*/
175115
@Transactional(readOnly = true)
176-
public Page<Dataset> getDatasets(DatasetPagingQuery query) {
177-
RowBounds bounds = new RowBounds(query.getPage() * query.getSize(), query.getSize());
178-
List<Dataset> content = datasetRepository.findByCriteria(query.getType(), query.getStatus(), query.getKeyword(), query.getTagList(), bounds);
179-
long total = datasetRepository.countByCriteria(query.getType(), query.getStatus(), query.getKeyword(), query.getTagList());
180-
181-
// 为每个数据集填充标签信息
182-
if (CollectionUtils.isNotEmpty(content)) {
183-
for (Dataset dataset : content) {
184-
List<Tag> tags = tagMapper.findByDatasetId(dataset.getId());
185-
if (tags != null) {
186-
dataset.getTags().addAll(tags);
187-
}
188-
}
189-
}
190-
return new PageImpl<>(content, PageRequest.of(query.getPage(), query.getSize()), total);
116+
public PagedResponse<DatasetResponse> getDatasets(DatasetPagingQuery query) {
117+
IPage<Dataset> page = new Page<>(query.getPage(), query.getSize());
118+
page = datasetRepository.findByCriteria(page, query);
119+
return PagedResponse.of(DatasetConverter.INSTANCE.convertToResponse(page.getRecords()), page.getCurrent(), page.getTotal(), page.getPages());
191120
}
192121

193122
/**
@@ -272,7 +201,8 @@ public AllDatasetStatisticsResponse getAllDatasetStatistics() {
272201

273202
/**
274203
* 异步处理数据源文件扫描
275-
* @param datasetId 数据集ID
204+
*
205+
* @param datasetId 数据集ID
276206
* @param dataSourceId 数据源ID(归集任务ID)
277207
*/
278208
@Async
@@ -309,8 +239,7 @@ public void processDataSourceAsync(String datasetId, String dataSourceId) {
309239
List<DatasetFile> datasetFiles = fileMetadataService.scanFiles(filePaths, datasetId);
310240
// 查询数据集中已存在的文件
311241
List<DatasetFile> existDatasetFileList = datasetFileRepository.findAllByDatasetId(datasetId);
312-
Map<String, DatasetFile> existDatasetFilePathMap = existDatasetFileList.
313-
stream().collect(Collectors.toMap(DatasetFile::getFilePath, Function.identity()));
242+
Map<String, DatasetFile> existDatasetFilePathMap = existDatasetFileList.stream().collect(Collectors.toMap(DatasetFile::getFilePath, Function.identity()));
314243
Dataset dataset = datasetRepository.getById(datasetId);
315244

316245
// 6. 批量插入数据集文件表

backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/application/DatasetFileApplicationService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
import java.util.UUID;
4343

4444
/**
45-
* 数据集文件应用服务(UUID 模式)
45+
* 数据集文件应用服务
4646
*/
4747
@Slf4j
4848
@Service

backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/domain/model/dataset/Dataset.java

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.baomidou.mybatisplus.annotation.TableField;
44
import com.baomidou.mybatisplus.annotation.TableName;
5+
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
56
import com.dataengine.common.domain.model.base.BaseEntity;
67
import com.dataengine.datamanagement.common.enums.DatasetStatusType;
78
import com.dataengine.datamanagement.common.enums.DatasetType;
@@ -10,9 +11,7 @@
1011

1112
import java.io.File;
1213
import java.time.LocalDateTime;
13-
import java.util.ArrayList;
14-
import java.util.List;
15-
import java.util.UUID;
14+
import java.util.*;
1615

1716
/**
1817
* 数据集实体(与数据库表 t_dm_datasets 对齐)
@@ -65,6 +64,11 @@ public class Dataset extends BaseEntity<String> {
6564
* 数据集保留天数
6665
*/
6766
private Integer retentionDays = 0;
67+
/**
68+
* 标签列表, JSON格式
69+
*/
70+
@TableField(typeHandler = JacksonTypeHandler.class)
71+
private Collection<Tag> tags = new HashSet<>();
6872
/**
6973
* 额外元数据,JSON格式
7074
*/
@@ -86,9 +90,6 @@ public class Dataset extends BaseEntity<String> {
8690
*/
8791
private Long version = 0L;
8892

89-
// 聚合内的便捷集合(非持久化关联,由应用服务填充)
90-
@TableField(exist = false)
91-
private List<Tag> tags = new ArrayList<>();
9293
@TableField(exist = false)
9394
private List<DatasetFile> files = new ArrayList<>();
9495

@@ -113,10 +114,6 @@ public void initCreateParam(String datasetBasePath) {
113114
this.id = UUID.randomUUID().toString();
114115
this.path = datasetBasePath + File.separator + this.id;
115116
this.status = DatasetStatusType.DRAFT;
116-
this.createdBy = "system";
117-
this.updatedBy = "system";
118-
this.createdAt = LocalDateTime.now();
119-
this.updatedAt = LocalDateTime.now();
120117
}
121118

122119
public void updateBasicInfo(String name, String description, String category) {
Lines changed: 13 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
package com.dataengine.datamanagement.domain.model.dataset;
22

3-
import java.time.LocalDateTime;
3+
import com.dataengine.common.domain.model.base.BaseEntity;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import lombok.Setter;
48

59
/**
610
* 标签实体(与数据库表 t_dm_tags 对齐)
711
*/
8-
public class Tag {
9-
10-
private String id; // UUID
12+
@Getter
13+
@Setter
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
public class Tag extends BaseEntity<String> {
1117
private String name;
1218
private String description;
1319
private String category;
1420
private String color;
1521
private Long usageCount = 0L;
16-
private LocalDateTime createdAt;
17-
private LocalDateTime updatedAt;
18-
19-
public Tag() {}
2022

2123
public Tag(String name, String description, String category, String color) {
2224
this.name = name;
@@ -25,31 +27,7 @@ public Tag(String name, String description, String category, String color) {
2527
this.color = color;
2628
}
2729

28-
public void incrementUsage() { this.usageCount = (this.usageCount == null ? 1 : this.usageCount + 1); }
29-
public void decrementUsage() { if (this.usageCount != null && this.usageCount > 0) this.usageCount--; }
30-
31-
// Getters & Setters
32-
public String getId() { return id; }
33-
public void setId(String id) { this.id = id; }
34-
35-
public String getName() { return name; }
36-
public void setName(String name) { this.name = name; }
37-
38-
public String getDescription() { return description; }
39-
public void setDescription(String description) { this.description = description; }
40-
41-
public String getCategory() { return category; }
42-
public void setCategory(String category) { this.category = category; }
43-
44-
public String getColor() { return color; }
45-
public void setColor(String color) { this.color = color; }
46-
47-
public Long getUsageCount() { return usageCount; }
48-
public void setUsageCount(Long usageCount) { this.usageCount = usageCount; }
49-
50-
public LocalDateTime getCreatedAt() { return createdAt; }
51-
public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; }
52-
53-
public LocalDateTime getUpdatedAt() { return updatedAt; }
54-
public void setUpdatedAt(LocalDateTime updatedAt) { this.updatedAt = updatedAt; }
30+
public void decrementUsage() {
31+
if (this.usageCount != null && this.usageCount > 0) this.usageCount--;
32+
}
5533
}

0 commit comments

Comments
 (0)