Skip to content

Commit 7836955

Browse files
committed
Merge remote-tracking branch 'origin/develop_930' into develop_930
2 parents 0e94e5d + 8b8545e commit 7836955

8 files changed

Lines changed: 174 additions & 11 deletions

File tree

backend/pom.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<mybatis-plus.version>3.5.5</mybatis-plus.version>
3434
<mapstruct.version>1.6.3</mapstruct.version>
3535
<lombok.version>1.18.32</lombok.version>
36+
<lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
3637
</properties>
3738

3839
<modules>
@@ -120,6 +121,12 @@
120121
<version>${mapstruct.version}</version>
121122
</dependency>
122123

124+
<dependency>
125+
<groupId>org.projectlombok</groupId>
126+
<artifactId>lombok</artifactId>
127+
<version>${lombok.version}</version>
128+
</dependency>
129+
123130
<dependency>
124131
<groupId>mysql</groupId>
125132
<artifactId>mysql-connector-java</artifactId>
@@ -152,6 +159,12 @@
152159
<artifactId>lombok</artifactId>
153160
<version>${lombok.version}</version>
154161
</dependency>
162+
163+
<dependency>
164+
<groupId>org.mapstruct</groupId>
165+
<artifactId>mapstruct</artifactId>
166+
<version>${mapstruct.version}</version>
167+
</dependency>
155168
</dependencies>
156169

157170
<build>

backend/services/data-management-service/pom.xml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,41 @@
7272
<groupId>org.springframework.boot</groupId>
7373
<artifactId>spring-boot-maven-plugin</artifactId>
7474
<configuration>
75+
<arguments>true</arguments>
7576
<classifier>exec</classifier>
7677
</configuration>
7778
</plugin>
79+
<plugin>
80+
<groupId>org.apache.maven.plugins</groupId>
81+
<artifactId>maven-compiler-plugin</artifactId>
82+
<version>3.11.0</version>
83+
<configuration>
84+
<source>${maven.compiler.source}</source>
85+
<target>${maven.compiler.target}</target>
86+
<annotationProcessorPaths>
87+
<!-- 顺序很重要 -->
88+
<path>
89+
<groupId>org.projectlombok</groupId>
90+
<artifactId>lombok</artifactId>
91+
<version>${lombok.version}</version>
92+
</path>
93+
<path>
94+
<groupId>org.projectlombok</groupId>
95+
<artifactId>lombok-mapstruct-binding</artifactId>
96+
<version>${lombok-mapstruct-binding.version}</version>
97+
</path>
98+
<path>
99+
<groupId>org.mapstruct</groupId>
100+
<artifactId>mapstruct-processor</artifactId>
101+
<version>${mapstruct.version}</version>
102+
</path>
103+
</annotationProcessorPaths>
104+
<compilerArgs>
105+
<arg>-parameters</arg>
106+
<arg>-Amapstruct.defaultComponentModel=spring</arg>
107+
</compilerArgs>
108+
</configuration>
109+
</plugin>
78110
</plugins>
79111
</build>
80112
</project>

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.springframework.beans.factory.annotation.Autowired;
66
import org.springframework.stereotype.Service;
77
import org.springframework.transaction.annotation.Transactional;
8+
import org.springframework.util.CollectionUtils;
89

910
import java.util.List;
1011
import java.util.UUID;
@@ -39,6 +40,37 @@ public Tag createTag(String name, String color, String description) {
3940
return tagMapper.findById(tag.getId());
4041
}
4142

43+
/**
44+
* 更新标签
45+
*
46+
* @param tag 待更新的标签实体,必须包含有效的 ID
47+
* @return 更新结果
48+
*/
49+
@Transactional
50+
public Tag updateTag(Tag tag) {
51+
Tag existingTag = tagMapper.findById(tag.getId());
52+
if (existingTag == null) {
53+
throw new IllegalArgumentException("Tag not found: " + tag.getId());
54+
}
55+
existingTag.setName(tag.getName());
56+
existingTag.setColor(tag.getColor());
57+
existingTag.setDescription(tag.getDescription());
58+
tagMapper.update(existingTag);
59+
return tagMapper.findById(existingTag.getId());
60+
}
61+
62+
@Transactional
63+
public void deleteTag(List<String> tagIds) {
64+
List<Tag> tags = tagMapper.findByIdIn(tagIds);
65+
if (tags.stream().anyMatch(tag -> tag.getUsageCount() > 0)) {
66+
throw new IllegalArgumentException("Cannot delete tags that are in use");
67+
}
68+
if (CollectionUtils.isEmpty(tags)) {
69+
return;
70+
}
71+
tagMapper.deleteTagsById(tags.stream().map(Tag::getId).toList());
72+
}
73+
4274
/**
4375
* 获取所有标签
4476
*/

backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/infrastructure/persistence/mapper/TagMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ public interface TagMapper {
1111
Tag findById(@Param("id") String id);
1212
Tag findByName(@Param("name") String name);
1313
List<Tag> findByNameIn(@Param("list") List<String> names);
14+
List<Tag> findByIdIn(@Param("ids") List<String> ids);
1415
List<Tag> findByKeyword(@Param("keyword") String keyword);
1516
List<Tag> findAllByOrderByUsageCountDesc();
1617

@@ -22,4 +23,5 @@ public interface TagMapper {
2223
int insertDatasetTag(@Param("datasetId") String datasetId, @Param("tagId") String tagId);
2324
int deleteDatasetTagsByDatasetId(@Param("datasetId") String datasetId);
2425
List<Tag> findByDatasetId(@Param("datasetId") String datasetId);
26+
void deleteTagsById(@Param("ids") List<String> ids);
2527
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.dataengine.datamanagement.interfaces.converter;
2+
3+
import com.dataengine.datamanagement.domain.model.dataset.Tag;
4+
import com.dataengine.datamanagement.interfaces.dto.TagResponse;
5+
import com.dataengine.datamanagement.interfaces.dto.UpdateTagRequest;
6+
import org.mapstruct.Mapper;
7+
import org.mapstruct.factory.Mappers;
8+
9+
/**
10+
* 标签转换器
11+
*/
12+
@Mapper
13+
public interface TagConverter {
14+
/** 单例实例 */
15+
TagConverter INSTANCE = Mappers.getMapper(TagConverter.class);
16+
17+
/**
18+
* 将 UpdateTagRequest 转换为 Tag 实体
19+
* @param request 更新标签请求DTO
20+
* @return 标签实体
21+
*/
22+
Tag updateRequestToTag(UpdateTagRequest request);
23+
24+
/**
25+
* 将 Tag 实体转换为 TagResponse DTO
26+
* @param tag 标签实体
27+
* @return 标签响应DTO
28+
*/
29+
TagResponse convertToResponse(Tag tag);
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.dataengine.datamanagement.interfaces.dto;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
6+
/**
7+
* 更新标签请求DTO
8+
*/
9+
@Getter
10+
@Setter
11+
public class UpdateTagRequest {
12+
/** 标签 ID */
13+
private String id;
14+
/** 标签名称 */
15+
private String name;
16+
/** 标签颜色 */
17+
private String color;
18+
/** 标签描述 */
19+
private String description;
20+
}

backend/services/data-management-service/src/main/java/com/dataengine/datamanagement/interfaces/rest/TagController.java

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,19 @@
33
import com.dataengine.common.interfaces.Response;
44
import com.dataengine.datamanagement.application.service.TagApplicationService;
55
import com.dataengine.datamanagement.domain.model.dataset.Tag;
6+
import com.dataengine.datamanagement.interfaces.converter.TagConverter;
67
import com.dataengine.datamanagement.interfaces.dto.CreateTagRequest;
78
import com.dataengine.datamanagement.interfaces.dto.TagResponse;
9+
import com.dataengine.datamanagement.interfaces.dto.UpdateTagRequest;
10+
import jakarta.validation.Valid;
11+
import jakarta.validation.constraints.Size;
12+
import org.apache.commons.lang3.StringUtils;
813
import org.springframework.beans.factory.annotation.Autowired;
914
import org.springframework.http.ResponseEntity;
1015
import org.springframework.web.bind.annotation.*;
1116

1217
import java.util.List;
18+
import java.util.Objects;
1319
import java.util.stream.Collectors;
1420

1521
/**
@@ -30,10 +36,10 @@ public TagController(TagApplicationService tagApplicationService) {
3036
* 查询标签列表
3137
*/
3238
@GetMapping
33-
public ResponseEntity<Response<List<TagResponse>>> getTags(@RequestParam(required = false) String keyword) {
39+
public ResponseEntity<Response<List<TagResponse>>> getTags(@RequestParam(name = "keyword", required = false) String keyword) {
3440
List<Tag> tags = tagApplicationService.searchTags(keyword);
3541
List<TagResponse> response = tags.stream()
36-
.map(this::convertToResponse)
42+
.map(TagConverter.INSTANCE::convertToResponse)
3743
.collect(Collectors.toList());
3844
return ResponseEntity.ok(Response.ok(response));
3945
}
@@ -49,19 +55,31 @@ public ResponseEntity<Response<TagResponse>> createTag(@RequestBody CreateTagReq
4955
createTagRequest.getColor(),
5056
createTagRequest.getDescription()
5157
);
52-
return ResponseEntity.status(201).body(Response.ok(convertToResponse(tag)));
58+
return ResponseEntity.ok(Response.ok(TagConverter.INSTANCE.convertToResponse(tag)));
5359
} catch (IllegalArgumentException e) {
5460
return ResponseEntity.badRequest().body(Response.error(e.getMessage(), null));
5561
}
5662
}
5763

58-
private TagResponse convertToResponse(Tag tag) {
59-
TagResponse response = new TagResponse();
60-
response.setId(tag.getId());
61-
response.setName(tag.getName());
62-
response.setColor(tag.getColor());
63-
response.setDescription(tag.getDescription());
64-
response.setUsageCount(tag.getUsageCount() != null ? tag.getUsageCount().intValue() : null);
65-
return response;
64+
/**
65+
* 更新标签
66+
*
67+
* @param updateTagRequest 更新参数
68+
* @return 更新结果
69+
*/
70+
@PutMapping
71+
public ResponseEntity<Response<TagResponse>> updateTag(@RequestBody @Valid UpdateTagRequest updateTagRequest) {
72+
Tag tag = tagApplicationService.updateTag(TagConverter.INSTANCE.updateRequestToTag(updateTagRequest));
73+
return ResponseEntity.ok(Response.ok(TagConverter.INSTANCE.convertToResponse(tag)));
74+
}
75+
76+
@DeleteMapping
77+
public ResponseEntity<Response<Valid>> deleteTag(@RequestParam(value = "ids") @Valid @Size(max = 10) List<String> ids) {
78+
try {
79+
tagApplicationService.deleteTag(ids.stream().filter(StringUtils::isNoneBlank).distinct().toList());
80+
return ResponseEntity.ok(Response.ok(null));
81+
} catch (IllegalArgumentException e) {
82+
return ResponseEntity.badRequest().body(Response.error(e.getMessage(), null));
83+
}
6684
}
6785
}

backend/services/data-management-service/src/main/resources/mappers/TagMapper.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,20 @@
9292
ORDER BY t.usage_count DESC, t.name ASC
9393
</select>
9494

95+
<delete id="deleteTagsById">
96+
DELETE FROM t_dm_tags WHERE
97+
id IN
98+
<foreach collection="ids" item="id" open="(" separator="," close=")">
99+
#{id}
100+
</foreach>
101+
</delete>
102+
103+
<select id="findByIdIn" resultMap="TagResultMap">
104+
SELECT <include refid="Base_Column_List"/>
105+
FROM t_dm_tags
106+
WHERE id IN
107+
<foreach collection="ids" item="id" open="(" separator="," close=")">
108+
#{id}
109+
</foreach>
110+
</select>
95111
</mapper>

0 commit comments

Comments
 (0)