Skip to content

Commit 7d4dcb7

Browse files
hhhhsc701Zzzxxxxy
andauthored
fix: 修复入库可能重复;筛选逻辑优化 (#226)
* 修改数据清洗筛选逻辑-筛选修改为多选 * 修改数据清洗筛选逻辑-筛选修改为多选 * antd 组件库样式定制修改 * fix: 修复入库可能重复 * fix: 算子市场筛选逻辑优化 * fix: 清洗任务创建筛选逻辑优化 * fix: 清洗任务创建筛选逻辑优化 --------- Co-authored-by: chase <byzhangxin11@126.com>
1 parent 49cc989 commit 7d4dcb7

19 files changed

Lines changed: 247 additions & 152 deletions

File tree

backend/services/operator-market-service/src/main/java/com/datamate/operator/application/CategoryService.java

Lines changed: 2 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package com.datamate.operator.application;
22

33

4-
import com.datamate.operator.domain.contants.OperatorConstant;
54
import com.datamate.operator.domain.repository.CategoryRelationRepository;
65
import com.datamate.operator.domain.repository.CategoryRepository;
7-
import com.datamate.operator.domain.repository.OperatorRepository;
86
import com.datamate.operator.interfaces.dto.CategoryDto;
97
import com.datamate.operator.interfaces.dto.CategoryRelationDto;
108
import com.datamate.operator.interfaces.dto.CategoryTreeResponse;
@@ -21,7 +19,7 @@
2119
@Service
2220
@RequiredArgsConstructor
2321
public class CategoryService {
24-
private final OperatorRepository operatorRepo;
22+
2523

2624
private final CategoryRepository categoryRepo;
2725

@@ -42,7 +40,7 @@ public List<CategoryTreeResponse> getAllCategories() {
4240
.filter(relation -> !StringUtils.equals(relation.getParentId(), "0"))
4341
.collect(Collectors.groupingBy(CategoryDto::getParentId));
4442

45-
List<CategoryTreeResponse> categoryTreeResponses = groupedByParentId.entrySet().stream()
43+
return groupedByParentId.entrySet().stream()
4644
.sorted(categoryComparator(nameMap))
4745
.map(entry -> {
4846
String parentId = entry.getKey();
@@ -58,10 +56,6 @@ public List<CategoryTreeResponse> getAllCategories() {
5856
response.setCount(totalCount.get());
5957
return response;
6058
}).collect(Collectors.toCollection(ArrayList::new));
61-
62-
int stars = operatorRepo.countOperatorByStar(true);
63-
categoryTreeResponses.add(buildStarCategoryTree(stars));
64-
return categoryTreeResponses;
6559
}
6660

6761
private Comparator<Map.Entry<String, List<CategoryDto>>> categoryComparator(Map<String, CategoryDto> categoryMap) {
@@ -71,21 +65,4 @@ private Comparator<Map.Entry<String, List<CategoryDto>>> categoryComparator(Map<
7165
return index1.compareTo(index2);
7266
};
7367
}
74-
75-
private CategoryTreeResponse buildStarCategoryTree(int stars) {
76-
CategoryTreeResponse starResponse = new CategoryTreeResponse();
77-
starResponse.setName("收藏状态");
78-
starResponse.setCount(stars);
79-
starResponse.setId("257b27e0-bba9-11f0-89d7-00155d0a6153");
80-
CategoryDto star = new CategoryDto();
81-
star.setId(OperatorConstant.CATEGORY_STAR_ID);
82-
star.setName("已收藏");
83-
star.setValue("isStar");
84-
star.setCount(stars);
85-
star.setParentId("257b27e0-bba9-11f0-89d7-00155d0a6153");
86-
star.setCreatedAt(LocalDateTime.now());
87-
star.setType("predefined");
88-
starResponse.setCategories(Collections.singletonList(star));
89-
return starResponse;
90-
}
9168
}

backend/services/operator-market-service/src/main/java/com/datamate/operator/application/OperatorService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ public class OperatorService {
5252
@Value("${operator.base.path:/operators}")
5353
private String operatorBasePath;
5454

55-
public List<OperatorDto> getOperators(Integer page, Integer size, List<String> categories,
55+
public List<OperatorDto> getOperators(Integer page, Integer size, List<List<String>> categories,
5656
String keyword, Boolean isStar) {
5757
return operatorViewRepo.findOperatorsByCriteria(page, size, keyword, categories, isStar);
5858
}
5959

60-
public int getOperatorsCount(List<String> categories, String keyword, Boolean isStar) {
60+
public int getOperatorsCount(List<List<String>> categories, String keyword, Boolean isStar) {
6161
return operatorViewRepo.countOperatorsByCriteria(keyword, categories, isStar);
6262
}
6363

backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/repository/OperatorViewRepository.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88

99
public interface OperatorViewRepository extends IRepository<OperatorView> {
1010
List<OperatorDto> findOperatorsByCriteria(Integer page, Integer size, String keyword,
11-
List<String> categories, Boolean isStar);
11+
List<List<String>> categories, Boolean isStar);
1212

13-
Integer countOperatorsByCriteria(String keyword, List<String> categories, Boolean isStar);
13+
int countOperatorsByCriteria(String keyword, List<List<String>> categories, Boolean isStar);
1414

1515
OperatorView findOperatorById(String id);
1616
}

backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/persistence/Impl/OperatorViewRepositoryImpl.java

Lines changed: 44 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.springframework.stereotype.Repository;
1717

1818
import java.util.List;
19+
import java.util.stream.Collectors;
1920

2021
@Repository
2122
@RequiredArgsConstructor
@@ -24,18 +25,36 @@ public class OperatorViewRepositoryImpl extends CrudRepository<OperatorViewMappe
2425

2526
@Override
2627
public List<OperatorDto> findOperatorsByCriteria(Integer page, Integer size, String keyword,
27-
List<String> categories, Boolean isStar) {
28+
List<List<String>> categories, Boolean isStar) {
2829
QueryWrapper<OperatorView> queryWrapper = Wrappers.query();
29-
queryWrapper.in(CollectionUtils.isNotEmpty(categories), "category_id", categories)
30-
.eq(isStar != null, "is_star", isStar);
30+
queryWrapper.eq(isStar != null, "is_star", isStar);
3131
if (StringUtils.isNotEmpty(keyword)) {
3232
queryWrapper.and(w ->
3333
w.like("operator_name", keyword)
3434
.or()
3535
.like("description", keyword));
3636
}
37+
StringBuilder havingSql = new StringBuilder();
38+
if (CollectionUtils.isNotEmpty(categories)) {
39+
queryWrapper.in("category_id", categories.stream().flatMap(List::stream).toList());
40+
int index = 0;
41+
for (List<String> category : categories) {
42+
if (index > 0) {
43+
havingSql.append(" AND ");
44+
}
45+
havingSql.append("SUM(CASE WHEN category_id IN (");
46+
havingSql.append(category.stream()
47+
.map(id -> "'" + id + "'")
48+
.collect(Collectors.joining(",")));
49+
havingSql.append(") THEN 1 ELSE 0 END) > 0");
50+
index++;
51+
}
52+
}
53+
3754
queryWrapper.groupBy("operator_id")
55+
.having(!havingSql.isEmpty(), havingSql.toString())
3856
.orderByDesc("created_at");
57+
3958
Page<OperatorView> queryPage;
4059
if (size != null && page != null) {
4160
queryPage = new Page<>(page + 1, size);
@@ -48,17 +67,35 @@ public List<OperatorDto> findOperatorsByCriteria(Integer page, Integer size, Str
4867
}
4968

5069
@Override
51-
public Integer countOperatorsByCriteria(String keyword, List<String> categories, Boolean isStar) {
70+
public int countOperatorsByCriteria(String keyword, List<List<String>> categories, Boolean isStar) {
5271
QueryWrapper<OperatorView> queryWrapper = Wrappers.query();
53-
queryWrapper.in(CollectionUtils.isNotEmpty(categories),"category_id", categories)
54-
.eq(isStar != null, "is_star", isStar);
72+
queryWrapper.eq(isStar != null, "is_star", isStar);
5573
if (StringUtils.isNotEmpty(keyword)) {
5674
queryWrapper.and(w ->
5775
w.like("operator_name", keyword)
5876
.or()
5977
.like("description", keyword));
6078
}
61-
return mapper.countOperatorsByCriteria(queryWrapper);
79+
StringBuilder havingSql = new StringBuilder();
80+
if (CollectionUtils.isNotEmpty(categories)) {
81+
queryWrapper.in("category_id", categories.stream().flatMap(List::stream).toList());
82+
int index = 0;
83+
for (List<String> category : categories) {
84+
if (index > 0) {
85+
havingSql.append(" AND ");
86+
}
87+
havingSql.append("SUM(CASE WHEN category_id IN (");
88+
havingSql.append(category.stream()
89+
.map(id -> "'" + id + "'")
90+
.collect(Collectors.joining(",")));
91+
havingSql.append(") THEN 1 ELSE 0 END) > 0");
92+
index++;
93+
}
94+
}
95+
queryWrapper.groupBy("operator_id")
96+
.having(!havingSql.isEmpty(), havingSql.toString());
97+
Integer count = mapper.countOperatorsByCriteria(queryWrapper);
98+
return count != null ? count : 0;
6299
}
63100

64101
@Override

backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/persistence/mapper/OperatorViewMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public interface OperatorViewMapper extends BaseMapper<OperatorView> {
1919
IPage<OperatorView> findOperatorsByCriteria(IPage<OperatorView> page,
2020
@Param(Constants.WRAPPER) Wrapper<OperatorView> queryWrapper);
2121

22-
@Select("SELECT COUNT(DISTINCT operator_id) AS count FROM v_operator ${ew.customSqlSegment}")
22+
@Select("SELECT COUNT(1) FROM (SELECT 1 FROM v_operator ${ew.customSqlSegment}) AS t")
2323
Integer countOperatorsByCriteria(@Param(Constants.WRAPPER) Wrapper<OperatorView> queryWrapper);
2424

2525
@Select("SELECT operator_id AS id, operator_name AS name, description, version, inputs, outputs, runtime, " +
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.datamate.operator.interfaces.dto;
2+
3+
import com.datamate.common.interfaces.PagedResponse;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.Setter;
7+
8+
import java.util.List;
9+
10+
@Getter
11+
@Setter
12+
@AllArgsConstructor
13+
public class CategoryTreePagedResponse extends PagedResponse<CategoryTreeResponse> {
14+
Integer starCount;
15+
16+
public CategoryTreePagedResponse(List<CategoryTreeResponse> content, Integer starCount) {
17+
super(content);
18+
this.starCount = starCount;
19+
}
20+
21+
public static CategoryTreePagedResponse of(List<CategoryTreeResponse> content, Integer starCount) {
22+
return new CategoryTreePagedResponse(content, starCount);
23+
}
24+
}

backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/OperatorsListPostRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
@Getter
1616
@Setter
1717
public class OperatorsListPostRequest extends PagingQuery {
18-
private List<String> categories = new ArrayList<>();
18+
private List<List<String>> categories = new ArrayList<>();
1919

2020
private String keyword;
2121

backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/CategoryController.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.datamate.common.interfaces.PagedResponse;
44
import com.datamate.operator.application.CategoryService;
5+
import com.datamate.operator.domain.repository.OperatorRepository;
6+
import com.datamate.operator.interfaces.dto.CategoryTreePagedResponse;
57
import com.datamate.operator.interfaces.dto.CategoryTreeResponse;
68
import lombok.RequiredArgsConstructor;
79
import org.springframework.web.bind.annotation.GetMapping;
@@ -17,9 +19,11 @@
1719
public class CategoryController {
1820
private final CategoryService categoryService;
1921

22+
private final OperatorRepository operatorRepo;
23+
2024
@GetMapping("/tree")
2125
public PagedResponse<CategoryTreeResponse> categoryTreeGet() {
2226
List<CategoryTreeResponse> allCategories = categoryService.getAllCategories();
23-
return PagedResponse.of(allCategories);
27+
return CategoryTreePagedResponse.of(allCategories, operatorRepo.countOperatorByStar(true));
2428
}
2529
}

backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/OperatorController.java

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@
33
import com.datamate.common.infrastructure.common.IgnoreResponseWrap;
44
import com.datamate.common.interfaces.PagedResponse;
55
import com.datamate.operator.application.OperatorService;
6-
import com.datamate.operator.domain.contants.OperatorConstant;
76
import com.datamate.operator.interfaces.dto.OperatorDto;
87
import com.datamate.operator.interfaces.dto.OperatorsListPostRequest;
98
import com.datamate.operator.interfaces.dto.UploadOperatorRequest;
109
import lombok.RequiredArgsConstructor;
11-
import org.apache.commons.collections4.CollectionUtils;
1210
import org.springframework.core.io.Resource;
1311
import org.springframework.http.HttpHeaders;
1412
import org.springframework.http.HttpStatus;
@@ -27,16 +25,10 @@ public class OperatorController {
2725

2826
@PostMapping("/list")
2927
public PagedResponse<OperatorDto> operatorsListPost(@RequestBody OperatorsListPostRequest request) {
30-
Boolean isStar = null;
31-
List<String> categories = request.getCategories();
32-
if (CollectionUtils.isNotEmpty(request.getCategories()) &&
33-
request.getCategories().contains(OperatorConstant.CATEGORY_STAR_ID)) {
34-
isStar = true;
35-
categories.remove(OperatorConstant.CATEGORY_STAR_ID);
36-
}
28+
List<List<String>> categories = request.getCategories();
3729
List<OperatorDto> responses = operatorService.getOperators(request.getPage(), request.getSize(),
38-
categories, request.getKeyword(), isStar);
39-
int count = operatorService.getOperatorsCount(categories, request.getKeyword(), isStar);
30+
categories, request.getKeyword(), request.getIsStar());
31+
int count = operatorService.getOperatorsCount(categories, request.getKeyword(), request.getIsStar());
4032
int totalPages = (count + request.getSize() + 1) / request.getSize();
4133
return PagedResponse.of(responses, request.getPage(), count, totalPages);
4234
}

frontend/src/hooks/useFetchData.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ export default function useFetchData<T>(
4444
status: [] as string[],
4545
tags: [] as string[],
4646
// 通用分类筛选(如算子市场的分类 ID 列表)
47-
categories: [] as string[],
47+
categories: [] as string[][],
48+
selectedStar: false,
4849
},
4950
current: 1,
5051
pageSize: 12,
@@ -113,11 +114,10 @@ export default function useFetchData<T>(
113114
// 同时执行主要数据获取和额外的轮询函数
114115
const promises = [
115116
fetchFunc({
116-
...Object.fromEntries(
117-
Object.entries(filter).filter(([_, value]) => value != null && value.length > 0)
118-
),
117+
categories: filter.categories,
119118
...extraParams,
120119
keyword,
120+
isStar: filter.selectedStar ? true : undefined,
121121
type: getFirstOfArray(filter?.type) || undefined,
122122
status: getFirstOfArray(filter?.status) || undefined,
123123
tags: filter?.tags?.length ? filter.tags.join(",") : undefined,

0 commit comments

Comments
 (0)