From 78431d5db1c1aadbccbeb1518e1744f6bc547fd4 Mon Sep 17 00:00:00 2001 From: tangwei Date: Sun, 26 Apr 2026 09:56:32 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=B5=81=E5=9F=9F=E6=A0=91=E5=BD=A2=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../env/controller/SdRvcdDicController.java | 8 +++ .../yfd/platform/env/domain/SdRvcdDic.java | 7 +++ .../env/service/ISdRvcdDicService.java | 7 +++ .../service/impl/SdRvcdDicServiceImpl.java | 60 ++++++++++++++++++- 4 files changed, 80 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/env/controller/SdRvcdDicController.java b/backend/src/main/java/com/yfd/platform/env/controller/SdRvcdDicController.java index db9159d..c4f0890 100644 --- a/backend/src/main/java/com/yfd/platform/env/controller/SdRvcdDicController.java +++ b/backend/src/main/java/com/yfd/platform/env/controller/SdRvcdDicController.java @@ -71,6 +71,14 @@ public class SdRvcdDicController { return ResponseResult.successData(rvcdDicService.getById(rvcd)); } + @GetMapping("/tree") + @Operation(summary = "获取流域树形结构") + public ResponseResult getTree( + @RequestParam(required = false) String rvcd, + @RequestParam(required = false) String rvnm) { + return ResponseResult.successData(rvcdDicService.getTree(rvcd, rvnm)); + } + // @Log(module = "流域管理", value = "新增流域") @PostMapping("/add") @Operation(summary = "新增流域") diff --git a/backend/src/main/java/com/yfd/platform/env/domain/SdRvcdDic.java b/backend/src/main/java/com/yfd/platform/env/domain/SdRvcdDic.java index 239cc4d..9f3a967 100644 --- a/backend/src/main/java/com/yfd/platform/env/domain/SdRvcdDic.java +++ b/backend/src/main/java/com/yfd/platform/env/domain/SdRvcdDic.java @@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode; import java.io.Serializable; import java.util.Date; +import java.util.List; /** *

@@ -114,4 +115,10 @@ public class SdRvcdDic implements Serializable { * 地图专题流域标识:1=是 0否 */ private Integer ismap; + + /** + * 子节点(用于树形结构,不映射数据库字段) + */ + @TableField(exist = false) + private List children; } diff --git a/backend/src/main/java/com/yfd/platform/env/service/ISdRvcdDicService.java b/backend/src/main/java/com/yfd/platform/env/service/ISdRvcdDicService.java index a66fb6a..ea8da57 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/ISdRvcdDicService.java +++ b/backend/src/main/java/com/yfd/platform/env/service/ISdRvcdDicService.java @@ -42,4 +42,11 @@ public interface ISdRvcdDicService extends IService { * 删除流域 */ boolean deleteRvcdDic(String rvcd); + + /** + * 获取流域树形结构 + * @param rvcd 流域编码(可选,为空则返回全部) + * @param rvnm 流域名称(可选,用于模糊搜索) + */ + List getTree(String rvcd, String rvnm); } diff --git a/backend/src/main/java/com/yfd/platform/env/service/impl/SdRvcdDicServiceImpl.java b/backend/src/main/java/com/yfd/platform/env/service/impl/SdRvcdDicServiceImpl.java index 51e4b69..85f77a4 100644 --- a/backend/src/main/java/com/yfd/platform/env/service/impl/SdRvcdDicServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/env/service/impl/SdRvcdDicServiceImpl.java @@ -6,8 +6,10 @@ import com.yfd.platform.env.domain.SdRvcdDic; import com.yfd.platform.env.mapper.SdRvcdDicMapper; import com.yfd.platform.env.service.ISdRvcdDicService; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; /** *

@@ -58,4 +60,58 @@ public class SdRvcdDicServiceImpl extends ServiceImpl getTree(String rvcd, String rvnm) { + List result = new ArrayList<>(); + + List rootList; + Set rootRvcdSet = new HashSet<>(); + + if (StringUtils.hasText(rvcd)) { + SdRvcdDic singleRvcd = this.getById(rvcd); + if (singleRvcd != null) { + rootList = new ArrayList<>(); + rootList.add(singleRvcd); + rootRvcdSet.add(singleRvcd.getRvcd()); + } else { + return result; + } + } else { + rootList = getRootList(); + for (SdRvcdDic root : rootList) { + rootRvcdSet.add(root.getRvcd()); + } + } + + List allList = this.lambdaQuery() + .like(StringUtils.hasText(rvnm), SdRvcdDic::getRvnm, rvnm) + .orderByAsc(SdRvcdDic::getOrderIndex) + .list(); + + Map> childrenMap = allList.stream() + .filter(item -> item.getPrvcd() != null) + .collect(Collectors.groupingBy(SdRvcdDic::getPrvcd)); + + for (SdRvcdDic root : rootList) { + if (rootRvcdSet.contains(root.getRvcd())) { + buildTreeRecursive(root, childrenMap, rootRvcdSet); + result.add(root); + } + } + + return result; + } + + private void buildTreeRecursive(SdRvcdDic parent, Map> childrenMap, Set rootRvcdSet) { + List children = childrenMap.get(parent.getRvcd()); + if (children != null && !children.isEmpty()) { + for (SdRvcdDic child : children) { + buildTreeRecursive(child, childrenMap, rootRvcdSet); + } + parent.setChildren(children); + } else { + parent.setChildren(new ArrayList<>()); + } + } +} \ No newline at end of file