From 507af43b7314a437e715987c52f5506d796aabaf Mon Sep 17 00:00:00 2001 From: jerryjzhang Date: Wed, 25 Mar 2026 08:49:55 +0800 Subject: [PATCH] =?UTF-8?q?feat(headless):=20=E4=BC=98=E5=8C=96=E7=BB=B4?= =?UTF-8?q?=E5=BA=A6=E5=80=BC=E6=98=A0=E5=B0=84=E5=A4=84=E7=90=86=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改后端 DimensionServiceImpl 中维度值映射的处理方式,支持批量操作 - 将单个 DimValueMap 对象修改为 List 列表结构 - 优化了新增、更新和删除维度值映射的算法逻辑 - 前端 DimensionValueSettingModal 组件适配新的 API 接口格式 - 添加了预先处理请求列表的逻辑,设置默认的 techName 值 - 实现了批量删除和更新操作,提高处理效率 --- .../api/pojo/request/DimValueAliasReq.java | 6 +- .../service/impl/DimensionServiceImpl.java | 68 ++++++++++++------- .../components/DimensionValueSettingModal.tsx | 8 ++- 3 files changed, 54 insertions(+), 28 deletions(-) diff --git a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DimValueAliasReq.java b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DimValueAliasReq.java index 839a7d3ee..eedeec0bb 100644 --- a/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DimValueAliasReq.java +++ b/headless/api/src/main/java/com/tencent/supersonic/headless/api/pojo/request/DimValueAliasReq.java @@ -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 dimValueMaps; } diff --git a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DimensionServiceImpl.java b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DimensionServiceImpl.java index c07761514..0cf50d53b 100644 --- a/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DimensionServiceImpl.java +++ b/headless/server/src/main/java/com/tencent/supersonic/headless/server/service/impl/DimensionServiceImpl.java @@ -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 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 existingMap = dimValueMapList.stream() + .collect(Collectors.toMap(DimValueMap::getValue, v -> v, (v1, v2) -> v2)); + + // 收集需要删除的 values(alias 为空的) + Set 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; diff --git a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DimensionValueSettingModal.tsx b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DimensionValueSettingModal.tsx index da423b283..1179a4104 100644 --- a/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DimensionValueSettingModal.tsx +++ b/webapp/packages/supersonic-fe/src/pages/SemanticModel/components/DimensionValueSettingModal.tsx @@ -355,9 +355,11 @@ const DimensionValueSettingModal: React.FC = ({ onRecordSave={(record) => { modifyDimensionValue({ id: dimensionItem.id, - dimValueMaps: { - ...record, - }, + dimValueMaps: [ + { + ...record, + }, + ], }); }} hideCtrlBtn={['deleteBtn']}