Skip to content

Commit 2138ba2

Browse files
authored
feature: 增加算子详情页;优化算子上传更新逻辑 (#64)
* feature: 增加算子详情页;优化算子上传更新逻辑
1 parent 78f50ea commit 2138ba2

File tree

24 files changed

+338
-456
lines changed

24 files changed

+338
-456
lines changed

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

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

33

4+
import com.datamate.operator.domain.contants.OperatorConstant;
45
import com.datamate.operator.domain.repository.CategoryRelationRepository;
56
import com.datamate.operator.domain.repository.CategoryRepository;
7+
import com.datamate.operator.domain.repository.OperatorRepository;
68
import com.datamate.operator.interfaces.dto.CategoryDto;
79
import com.datamate.operator.interfaces.dto.CategoryRelationDto;
810
import com.datamate.operator.interfaces.dto.CategoryTreeResponse;
@@ -11,16 +13,16 @@
1113
import org.springframework.stereotype.Service;
1214

1315
import java.time.LocalDateTime;
14-
import java.util.Comparator;
15-
import java.util.List;
16-
import java.util.Map;
16+
import java.util.*;
1717
import java.util.concurrent.atomic.AtomicInteger;
1818
import java.util.function.Function;
1919
import java.util.stream.Collectors;
2020

2121
@Service
2222
@RequiredArgsConstructor
2323
public class CategoryService {
24+
private final OperatorRepository operatorRepo;
25+
2426
private final CategoryRepository categoryRepo;
2527

2628
private final CategoryRelationRepository categoryRelationRepo;
@@ -40,7 +42,7 @@ public List<CategoryTreeResponse> getAllCategories() {
4042
.filter(relation -> !StringUtils.equals(relation.getParentId(), "0"))
4143
.collect(Collectors.groupingBy(CategoryDto::getParentId));
4244

43-
return groupedByParentId.entrySet().stream()
45+
List<CategoryTreeResponse> categoryTreeResponses = groupedByParentId.entrySet().stream()
4446
.sorted(categoryComparator(nameMap))
4547
.map(entry -> {
4648
String parentId = entry.getKey();
@@ -55,7 +57,11 @@ public List<CategoryTreeResponse> getAllCategories() {
5557
}).sorted(Comparator.comparing(CategoryDto::getCreatedAt)).toList());
5658
response.setCount(totalCount.get());
5759
return response;
58-
}).toList();
60+
}).collect(Collectors.toCollection(ArrayList::new));
61+
62+
int stars = operatorRepo.countOperatorByStar(true);
63+
categoryTreeResponses.add(buildStarCategoryTree(stars));
64+
return categoryTreeResponses;
5965
}
6066

6167
private Comparator<Map.Entry<String, List<CategoryDto>>> categoryComparator(Map<String, CategoryDto> categoryMap) {
@@ -65,4 +71,21 @@ private Comparator<Map.Entry<String, List<CategoryDto>>> categoryComparator(Map<
6571
return index1.compareTo(index2);
6672
};
6773
}
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+
}
6891
}

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

Lines changed: 96 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,35 @@
22

33
import com.datamate.common.domain.model.ChunkUploadPreRequest;
44
import com.datamate.common.domain.service.FileService;
5+
import com.datamate.common.infrastructure.exception.BusinessException;
56
import com.datamate.operator.domain.contants.OperatorConstant;
67
import com.datamate.operator.infrastructure.converter.OperatorConverter;
78
import com.datamate.operator.domain.model.OperatorView;
89
import com.datamate.operator.domain.repository.CategoryRelationRepository;
910
import com.datamate.operator.domain.repository.OperatorRepository;
1011
import com.datamate.operator.domain.repository.OperatorViewRepository;
12+
import com.datamate.operator.infrastructure.exception.OperatorErrorCode;
1113
import com.datamate.operator.infrastructure.parser.ParserHolder;
1214
import com.datamate.operator.interfaces.dto.OperatorDto;
1315
import com.datamate.operator.interfaces.dto.UploadOperatorRequest;
16+
import com.fasterxml.jackson.core.JsonProcessingException;
17+
import com.fasterxml.jackson.databind.ObjectMapper;
1418
import lombok.RequiredArgsConstructor;
19+
import lombok.extern.slf4j.Slf4j;
20+
import org.apache.commons.collections4.CollectionUtils;
21+
import org.apache.commons.collections4.MapUtils;
22+
import org.apache.commons.lang3.StringUtils;
1523
import org.springframework.beans.factory.annotation.Value;
1624
import org.springframework.stereotype.Service;
1725
import org.springframework.transaction.annotation.Transactional;
1826

1927
import java.io.File;
28+
import java.util.ArrayList;
2029
import java.util.List;
30+
import java.util.Map;
2131

2232
@Service
33+
@Slf4j
2334
@RequiredArgsConstructor
2435
public class OperatorService {
2536
private final OperatorRepository operatorRepo;
@@ -32,6 +43,8 @@ public class OperatorService {
3243

3344
private final FileService fileService;
3445

46+
private final ObjectMapper objectMapper = new ObjectMapper();
47+
3548
@Value("${operator.base.path:/operators}")
3649
private String operatorBasePath;
3750

@@ -53,19 +66,25 @@ public OperatorDto getOperatorById(String id) {
5366

5467
@Transactional
5568
public OperatorDto createOperator(OperatorDto req) {
69+
overrideSettings(req);
5670
operatorRepo.insertOperator(req);
5771
relationRepo.batchInsert(req.getId(), req.getCategories());
5872
parserHolder.extractTo(getFileType(req.getFileName()), getUploadPath(req.getFileName()),
59-
getExtractPath(getFileNameWithoutExtension(req.getFileName())));
73+
getExtractPath(getFileNameWithoutExtension(req.getFileName())));
6074
return getOperatorById(req.getId());
6175
}
6276

6377
@Transactional
6478
public OperatorDto updateOperator(String id, OperatorDto req) {
79+
overrideSettings(req);
6580
operatorRepo.updateOperator(req);
66-
relationRepo.batchInsert(id, req.getCategories());
67-
parserHolder.extractTo(getFileType(req.getFileName()), getUploadPath(req.getFileName()),
68-
getExtractPath(getFileNameWithoutExtension(req.getFileName())));
81+
if (CollectionUtils.isNotEmpty(req.getCategories())) {
82+
relationRepo.batchUpdate(id, req.getCategories());
83+
}
84+
if (StringUtils.isNotBlank(req.getFileName())) {
85+
parserHolder.extractTo(getFileType(req.getFileName()), getUploadPath(req.getFileName()),
86+
getExtractPath(getFileNameWithoutExtension(req.getFileName())));
87+
}
6988
return getOperatorById(id);
7089
}
7190

@@ -77,7 +96,7 @@ public void deleteOperator(String id) {
7796

7897
public OperatorDto uploadOperator(String fileName) {
7998
return parserHolder.parseYamlFromArchive(getFileType(fileName), new File(getUploadPath(fileName)),
80-
OperatorConstant.YAML_PATH);
99+
OperatorConstant.YAML_PATH);
81100
}
82101

83102
public String preUpload() {
@@ -107,4 +126,76 @@ private String getUploadPath(String fileName) {
107126
private String getExtractPath(String fileName) {
108127
return operatorBasePath + File.separator + "extract" + File.separator + fileName;
109128
}
129+
130+
private void overrideSettings(OperatorDto operatorDto) {
131+
if (StringUtils.isBlank(operatorDto.getSettings()) || MapUtils.isEmpty(operatorDto.getOverrides())) {
132+
return;
133+
}
134+
try {
135+
Map<String, Map<String, Object>> settings = objectMapper.readValue(operatorDto.getSettings(), Map.class);
136+
for (Map.Entry<String, Object> entry : operatorDto.getOverrides().entrySet()) {
137+
String key = entry.getKey();
138+
if (!settings.containsKey(key)) {
139+
continue;
140+
}
141+
Object value = entry.getValue();
142+
Map<String, Object> setting = settings.get(key);
143+
String type = setting.get("type").toString();
144+
switch (type) {
145+
case "slider":
146+
case "switch":
147+
case "select":
148+
case "input":
149+
case "radio":
150+
setting.put("defaultVal", value);
151+
break;
152+
case "checkbox":
153+
setting.put("defaultVal", convertObjectToListString(value));
154+
break;
155+
case "range":
156+
updateProperties(setting, value);
157+
default:
158+
}
159+
settings.put(key, setting);
160+
}
161+
operatorDto.setSettings(objectMapper.writeValueAsString(settings));
162+
} catch (JsonProcessingException e) {
163+
throw BusinessException.of(OperatorErrorCode.SETTINGS_PARSE_FAILED, e.getMessage());
164+
}
165+
}
166+
167+
private String convertObjectToListString(Object object) {
168+
if (object == null) {
169+
return null;
170+
} else if (object instanceof List<?> list) {
171+
List<String> result = new ArrayList<>();
172+
for (Object item : list) {
173+
result.add(String.valueOf(item));
174+
}
175+
return String.join(",", result);
176+
} else {
177+
return object.toString();
178+
}
179+
}
180+
181+
private void updateProperties(Map<String, Object> setting, Object value) {
182+
List<Object> defaultValue = new ArrayList<>();
183+
if (value instanceof List) {
184+
defaultValue.addAll((List<?>) value);
185+
}
186+
187+
Object properties = setting.get("properties");
188+
if (properties instanceof List<?> list) {
189+
if (defaultValue.size() != list.size()) {
190+
return;
191+
}
192+
List<Map<String, Object>> result = new ArrayList<>();
193+
for (int i = 0; i < list.size(); i++) {
194+
Map<String, Object> map = objectMapper.convertValue(list.get(i), Map.class);
195+
map.put("defaultVal", defaultValue.get(i));
196+
result.add(map);
197+
}
198+
setting.put("properties", result);
199+
}
200+
}
110201
}

backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/contants/OperatorConstant.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ public class OperatorConstant {
2828

2929
public static String CATEGORY_ALL_ID = "4d7dbd77-0a92-44f3-9056-2cd62d4a71e4";
3030

31+
public static String CATEGORY_STAR_ID = "51847c24-bba9-11f0-888b-5b143cb738aa";
32+
3133
public static Map<String, String> CATEGORY_MAP = new HashMap<>();
3234

3335
static {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,7 @@ public interface CategoryRelationRepository extends IRepository<CategoryRelation
1212

1313
void batchInsert(String operatorId, List<String> categories);
1414

15+
void batchUpdate(String operatorId, List<String> categories);
16+
1517
void deleteByOperatorId(String operatorId);
1618
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,6 @@ public interface OperatorRepository extends IRepository<Operator> {
1414
void insertOperator(OperatorDto operator);
1515

1616
void deleteOperator(String id);
17+
18+
int countOperatorByStar(boolean isStar);
1719
}

backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/exception/OperatorErrorCode.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ public enum OperatorErrorCode implements ErrorCode {
1414

1515
YAML_NOT_FOUND("op.0002", "算子中缺少元数据文件"),
1616

17-
FIELD_NOT_FOUND("op.0003", "缺少必要的字段");
17+
FIELD_NOT_FOUND("op.0003", "缺少必要的字段"),
18+
19+
SETTINGS_PARSE_FAILED("op.0004", "settings字段解析失败");
1820

1921
private final String code;
2022
private final String message;

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ public void batchInsert(String operatorId, List<String> categories) {
3131
mapper.insert(categoryRelations);
3232
}
3333

34+
@Override
35+
public void batchUpdate(String operatorId, List<String> categories) {
36+
List<CategoryRelation> categoryRelations = categories.stream()
37+
.map(category -> new CategoryRelation(category, operatorId))
38+
.toList();
39+
LambdaQueryWrapper<CategoryRelation> queryWrapper = new LambdaQueryWrapper<>();
40+
queryWrapper.eq(CategoryRelation::getOperatorId, operatorId);
41+
mapper.delete(queryWrapper);
42+
mapper.insert(categoryRelations);
43+
}
44+
3445
@Override
3546
public void deleteByOperatorId(String operatorId) {
3647
LambdaQueryWrapper<CategoryRelation> queryWrapper = new LambdaQueryWrapper<>();

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.datamate.operator.infrastructure.persistence.Impl;
22

3+
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
34
import com.baomidou.mybatisplus.extension.repository.CrudRepository;
45
import com.datamate.operator.infrastructure.converter.OperatorConverter;
56
import com.datamate.operator.domain.model.Operator;
@@ -35,4 +36,11 @@ public void insertOperator(OperatorDto operator) {
3536
public void deleteOperator(String id) {
3637
mapper.deleteById(id);
3738
}
39+
40+
@Override
41+
public int countOperatorByStar(boolean isStar) {
42+
LambdaQueryWrapper<Operator> queryWrapper = new LambdaQueryWrapper<>();
43+
queryWrapper.eq(Operator::getIsStar, isStar);
44+
return Math.toIntExact(mapper.selectCount(queryWrapper));
45+
}
3846
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ public List<OperatorView> findOperatorsByCriteria(Integer page, Integer size, St
2727
queryWrapper.in(CollectionUtils.isNotEmpty(categories), "category_id", categories)
2828
.like(StringUtils.isNotBlank(operatorName), "operator_name", operatorName)
2929
.eq(isStar != null, "is_star", isStar)
30-
.groupBy("operator_id");
30+
.groupBy("operator_id")
31+
.orderByDesc("created_at");
3132
Page<OperatorView> queryPage = null;
3233
if (size != null && page != null) {
3334
queryPage = new Page<>(page + 1, size);

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
@@ -24,7 +24,7 @@ IPage<OperatorView> findOperatorsByCriteria(IPage<OperatorView> page,
2424

2525
@Select("SELECT operator_id AS id, operator_name AS name, description, version, inputs, outputs, runtime, " +
2626
"settings, is_star, created_at, updated_at, " +
27-
"GROUP_CONCAT(category_id ORDER BY created_at DESC SEPARATOR ',') AS categories " +
27+
"GROUP_CONCAT(category_name ORDER BY created_at DESC SEPARATOR ',') AS categories " +
2828
"FROM v_operator WHERE operator_id = #{id}")
2929
OperatorView findOperatorById(@Param("id") String id);
3030
}

0 commit comments

Comments
 (0)