feat(headless): 优化维度值映射处理逻辑
Some checks failed
supersonic CentOS CI / build (21) (push) Has been cancelled
supersonic mac CI / build (21) (push) Has been cancelled
supersonic ubuntu CI / build (21) (push) Has been cancelled
supersonic windows CI / build (21) (push) Has been cancelled

- 修改后端 DimensionServiceImpl 中维度值映射的处理方式,支持批量操作
- 将单个 DimValueMap 对象修改为 List<DimValueMap> 列表结构
- 优化了新增、更新和删除维度值映射的算法逻辑
- 前端 DimensionValueSettingModal 组件适配新的 API 接口格式
- 添加了预先处理请求列表的逻辑,设置默认的 techName 值
- 实现了批量删除和更新操作,提高处理效率
This commit is contained in:
jerryjzhang
2026-03-25 08:49:55 +08:00
parent c1d50f978d
commit 507af43b73
3 changed files with 54 additions and 28 deletions

View File

@@ -4,6 +4,8 @@ import com.tencent.supersonic.headless.api.pojo.DimValueMap;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.util.List;
/**
* @author: kanedai
* @date: 2024/10/31
@@ -15,7 +17,7 @@ public class DimValueAliasReq {
private Long id;
/**
* alias为空代表删除 否则更新
* alias 为空代表删除 否则更新
*/
DimValueMap dimValueMaps;
private List<DimValueMap> dimValueMaps;
}

View File

@@ -58,6 +58,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@Service
@@ -474,31 +475,52 @@ public class DimensionServiceImpl extends ServiceImpl<DimensionDOMapper, Dimensi
if (StringUtils.isNotEmpty(dimensionDO.getDimValueMaps())) {
dimValueMapList = JsonUtil.toList(dimensionDO.getDimValueMaps(), DimValueMap.class);
}
DimValueMap dimValueMaps = req.getDimValueMaps();
if (StringUtils.isEmpty(dimValueMaps.getTechName())) {
dimValueMaps.setTechName(dimValueMaps.getValue());
}
Map<String, DimValueMap> valeAndMapInfo = dimValueMapList.stream()
.collect(Collectors.toMap(DimValueMap::getValue, v -> v, (v1, v2) -> v2));
String value = dimValueMaps.getValue();
if (CollectionUtils.isEmpty(dimValueMaps.getAlias())) {
// 删除
dimValueMapList =
dimValueMapList.stream().filter(map -> !map.getValue().equalsIgnoreCase(value))
.collect(Collectors.toList());
} else {
// 新增
if (!valeAndMapInfo.keySet().contains(value)) {
dimValueMapList.add(dimValueMaps);
} else {
// 更新
dimValueMapList.stream().forEach(map -> {
if (map.getValue().equalsIgnoreCase(value)) {
map.setAlias(dimValueMaps.getAlias());
}
});
// 预先处理请求列表,设置默认的 techName
for (DimValueMap dimValueMap : req.getDimValueMaps()) {
if (StringUtils.isEmpty(dimValueMap.getTechName())) {
dimValueMap.setTechName(dimValueMap.getValue());
}
}
// 构建现有数据的 Map用于快速查找 (value -> DimValueMap)
Map<String, DimValueMap> existingMap = dimValueMapList.stream()
.collect(Collectors.toMap(DimValueMap::getValue, v -> v, (v1, v2) -> v2));
// 收集需要删除的 valuesalias 为空的)
Set<String> valuesToDelete = req.getDimValueMaps().stream()
.filter(dimValueMap -> CollectionUtils.isEmpty(dimValueMap.getAlias()))
.map(DimValueMap::getValue)
.collect(Collectors.toSet());
// 一次性删除所有需要删除的数据
if (!valuesToDelete.isEmpty()) {
dimValueMapList = dimValueMapList.stream()
.filter(map -> !valuesToDelete.contains(map.getValue()))
.collect(Collectors.toList());
// 同时从 existingMap 中移除
existingMap.keySet().removeAll(valuesToDelete);
}
// 处理新增和更新
for (DimValueMap dimValueMap : req.getDimValueMaps()) {
// 跳过需要删除的
if (CollectionUtils.isEmpty(dimValueMap.getAlias())) {
continue;
}
String value = dimValueMap.getValue();
if (!existingMap.containsKey(value)) {
// 新增
dimValueMapList.add(dimValueMap);
existingMap.put(value, dimValueMap);
} else {
// 更新 - 直接更新已存在的对象
DimValueMap existing = existingMap.get(value);
existing.setAlias(dimValueMap.getAlias());
}
}
dimensionDO.setDimValueMaps(JsonUtil.toString(dimValueMapList));
updateById(dimensionDO);
return true;

View File

@@ -355,9 +355,11 @@ const DimensionValueSettingModal: React.FC<CreateFormProps> = ({
onRecordSave={(record) => {
modifyDimensionValue({
id: dimensionItem.id,
dimValueMaps: {
...record,
},
dimValueMaps: [
{
...record,
},
],
});
}}
hideCtrlBtn={['deleteBtn']}