mirror of
https://github.com/tencentmusic/supersonic.git
synced 2026-04-29 12:34:28 +08:00
feat(headless): 优化维度值映射处理逻辑
- 修改后端 DimensionServiceImpl 中维度值映射的处理方式,支持批量操作 - 将单个 DimValueMap 对象修改为 List<DimValueMap> 列表结构 - 优化了新增、更新和删除维度值映射的算法逻辑 - 前端 DimensionValueSettingModal 组件适配新的 API 接口格式 - 添加了预先处理请求列表的逻辑,设置默认的 techName 值 - 实现了批量删除和更新操作,提高处理效率
This commit is contained in:
@@ -4,6 +4,8 @@ import com.tencent.supersonic.headless.api.pojo.DimValueMap;
|
|||||||
import jakarta.validation.constraints.NotNull;
|
import jakarta.validation.constraints.NotNull;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author: kanedai
|
* @author: kanedai
|
||||||
* @date: 2024/10/31
|
* @date: 2024/10/31
|
||||||
@@ -15,7 +17,7 @@ public class DimValueAliasReq {
|
|||||||
private Long id;
|
private Long id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* alias为空代表删除 否则更新
|
* alias 为空代表删除 否则更新
|
||||||
*/
|
*/
|
||||||
DimValueMap dimValueMaps;
|
private List<DimValueMap> dimValueMaps;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@@ -474,31 +475,52 @@ public class DimensionServiceImpl extends ServiceImpl<DimensionDOMapper, Dimensi
|
|||||||
if (StringUtils.isNotEmpty(dimensionDO.getDimValueMaps())) {
|
if (StringUtils.isNotEmpty(dimensionDO.getDimValueMaps())) {
|
||||||
dimValueMapList = JsonUtil.toList(dimensionDO.getDimValueMaps(), DimValueMap.class);
|
dimValueMapList = JsonUtil.toList(dimensionDO.getDimValueMaps(), DimValueMap.class);
|
||||||
}
|
}
|
||||||
DimValueMap dimValueMaps = req.getDimValueMaps();
|
|
||||||
if (StringUtils.isEmpty(dimValueMaps.getTechName())) {
|
// 预先处理请求列表,设置默认的 techName
|
||||||
dimValueMaps.setTechName(dimValueMaps.getValue());
|
for (DimValueMap dimValueMap : req.getDimValueMaps()) {
|
||||||
}
|
if (StringUtils.isEmpty(dimValueMap.getTechName())) {
|
||||||
Map<String, DimValueMap> valeAndMapInfo = dimValueMapList.stream()
|
dimValueMap.setTechName(dimValueMap.getValue());
|
||||||
.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());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 构建现有数据的 Map,用于快速查找 (value -> DimValueMap)
|
||||||
|
Map<String, DimValueMap> existingMap = dimValueMapList.stream()
|
||||||
|
.collect(Collectors.toMap(DimValueMap::getValue, v -> v, (v1, v2) -> v2));
|
||||||
|
|
||||||
|
// 收集需要删除的 values(alias 为空的)
|
||||||
|
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));
|
dimensionDO.setDimValueMaps(JsonUtil.toString(dimValueMapList));
|
||||||
updateById(dimensionDO);
|
updateById(dimensionDO);
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -355,9 +355,11 @@ const DimensionValueSettingModal: React.FC<CreateFormProps> = ({
|
|||||||
onRecordSave={(record) => {
|
onRecordSave={(record) => {
|
||||||
modifyDimensionValue({
|
modifyDimensionValue({
|
||||||
id: dimensionItem.id,
|
id: dimensionItem.id,
|
||||||
dimValueMaps: {
|
dimValueMaps: [
|
||||||
...record,
|
{
|
||||||
},
|
...record,
|
||||||
|
},
|
||||||
|
],
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
hideCtrlBtn={['deleteBtn']}
|
hideCtrlBtn={['deleteBtn']}
|
||||||
|
|||||||
Reference in New Issue
Block a user