From d35eb47d736db5e8312327905cc8be2f2e7aa079 Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 4 Aug 2026 17:19:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E9=A1=B5=E9=9D=A2bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/TreeStructureServiceImpl.java | 84 +++++----- .../vd/service/impl/VdMonitorServiceImpl.java | 5 +- .../service/impl/SdWtMonitorServiceImpl.java | 2 +- .../service/impl/SysMenuServiceImpl.java | 65 ++++++-- .../mapper/qgc_base/SdRvcdDicMapper.xml | 154 ++++++++++-------- 5 files changed, 182 insertions(+), 128 deletions(-) diff --git a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/TreeStructureServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/TreeStructureServiceImpl.java index 18a0ec2e..e14679f3 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/TreeStructureServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_base/service/impl/TreeStructureServiceImpl.java @@ -1,5 +1,6 @@ package com.yfd.platform.qgc_base.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.yfd.platform.qgc_base.domain.SdEngInfoBH; import com.yfd.platform.qgc_base.domain.SdHydrobase; import com.yfd.platform.qgc_base.domain.SdHbrvDic; @@ -363,25 +364,40 @@ public class TreeStructureServiceImpl implements ITreeStructureService { .collect(Collectors.toList()); } - // 2. 预加载所有流域下的电站(按流域分组) - Map> rvcdEngMap = new HashMap<>(); - for (SdRvcdDic rvcdDic : rvcdList) { - List engList = engInfoBHMapper.selectByRvcd(null,rvcdDic.getRvcd()); + if (rvcdList.isEmpty()) { + return result; + } - // 如果提供了电站名称参数,进行模糊匹配筛选 - if (StringUtils.hasText(engName) && engList != null) { - engList = engList.stream() - .filter(eng -> eng.getEnnm() != null && eng.getEnnm().contains(engName)) - .collect(Collectors.toList()); - } + // 2. 收集所有流域编码,一次批量查询替代 N 次循环查询 + List rvcdCodeList = rvcdList.stream() + .map(SdRvcdDic::getRvcd) + .collect(Collectors.toList()); + List allEngList = engInfoBHMapper.selectList(new LambdaQueryWrapper().in(SdEngInfoBH::getReachcd, rvcdCodeList)); +// List allEngList = engInfoBHMapper.selectByRvcdList(rvcdCodeList); - if (engList != null && !engList.isEmpty()) { - rvcdEngMap.put(rvcdDic.getRvcd(), engList); + // 3. 按流域分组,同时在内存中过滤电站名称 + Map> rvcdEngMap = new LinkedHashMap<>(); + if (allEngList != null) { + for (SdEngInfoBH eng : allEngList) { + String engRvcd = eng.getReachcd(); + if (!StringUtils.hasText(engRvcd) || !rvcdCodeList.contains(engRvcd)) { + continue; + } + if (StringUtils.hasText(engName) && eng.getEnnm() != null + && !eng.getEnnm().contains(engName)) { + continue; + } + rvcdEngMap.computeIfAbsent(engRvcd, k -> new ArrayList<>()).add(eng); } } - // 3. 构建二级树形结构(流域 -> 电站) + // 4. 构建二级树形结构(流域 -> 电站) for (SdRvcdDic rvcdDic : rvcdList) { + List engList = rvcdEngMap.get(rvcdDic.getRvcd()); + if (engList == null || engList.isEmpty()) { + continue; + } + Map rvcdNode = new LinkedHashMap<>(); rvcdNode.put("type", "RVCD"); rvcdNode.put("code", rvcdDic.getRvcd()); @@ -389,37 +405,25 @@ public class TreeStructureServiceImpl implements ITreeStructureService { rvcdNode.put("path", rvcdDic.getPath()); rvcdNode.put("orgLevel", 0); rvcdNode.put("grd", rvcdDic.getGrd()); -// rvcdNode.put("lgtd", rvcdDic.getLgtd()); -// rvcdNode.put("lttd", rvcdDic.getLttd()); rvcdNode.put("parentId", "0"); - // 获取该流域下的所有电站 - List engList = rvcdEngMap.get(rvcdDic.getRvcd()); - List> engChildren = new ArrayList<>(); - - if (engList != null && !engList.isEmpty()) { - for (SdEngInfoBH eng : engList) { - Map engNode = new LinkedHashMap<>(); - engNode.put("type", "STATION"); - engNode.put("code", eng.getStcd()); - engNode.put("name", eng.getEnnm()); -// engNode.put("lgtd", eng.getLgtd()); -// engNode.put("lttd", eng.getLttd()); - engNode.put("elev", eng.getElev()); - engNode.put("usfl", eng.getUsfl()); - engNode.put("bldstt", eng.getBldstt()); - engNode.put("engtp", eng.getEngtp()); - engNode.put("parentId", rvcdDic.getRvcd()); - engNode.put("orgLevel", 1); - engChildren.add(engNode); - } + List> engChildren = new ArrayList<>(engList.size()); + for (SdEngInfoBH eng : engList) { + Map engNode = new LinkedHashMap<>(); + engNode.put("type", "STATION"); + engNode.put("code", eng.getStcd()); + engNode.put("name", eng.getEnnm()); + engNode.put("elev", eng.getElev()); + engNode.put("usfl", eng.getUsfl()); + engNode.put("bldstt", eng.getBldstt()); + engNode.put("engtp", eng.getEngtp()); + engNode.put("parentId", rvcdDic.getRvcd()); + engNode.put("orgLevel", 1); + engChildren.add(engNode); } - // 只有当该流域下有电站时才添加该流域节点 - if (!engChildren.isEmpty()) { - rvcdNode.put("children", engChildren); - result.add(rvcdNode); - } + rvcdNode.put("children", engChildren); + result.add(rvcdNode); } return result; diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java index 173950ba..a49616a6 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/vd/service/impl/VdMonitorServiceImpl.java @@ -531,14 +531,15 @@ public class VdMonitorServiceImpl implements VdMonitorService { if (StrUtil.isNotBlank(filterSql)) { sql.append(" AND ").append(filterSql).append(" "); } - sql.append(buildVdPointOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); + DataSourceResult result = new DataSourceResult<>(); - DataScopeApplyResult scopeApplyResult = dataScopeFilterService.appendCurrentUserStationScope(sql, paramMap, "t.RSTCD"); + DataScopeApplyResult scopeApplyResult = dataScopeFilterService.appendCurrentUserStationScope(sql, paramMap, "t.rstcds"); if (scopeApplyResult.isEmptyResult()) { result.setData(new ArrayList<>()); result.setTotal(0L); return result; } + sql.append(buildVdPointOrderBySql(dataSourceRequest == null ? null : dataSourceRequest.getSort())); List list = microservicDynamicSQLMapper.pageAllListWithResultType( page, sql.toString(), paramMap, VdPointVo.class); result.setData(list); diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java index f50e5292..2f825c50 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_env/wt/service/impl/SdWtMonitorServiceImpl.java @@ -3033,7 +3033,7 @@ public class SdWtMonitorServiceImpl implements SdWtMonitorService { // paramMap.put("dtinType", dtinType); // } - DataScopeApplyResult scopeApplyResult = dataScopeFilterService.appendCurrentUserStationScope(sql, paramMap, "t.RSTCD"); + DataScopeApplyResult scopeApplyResult = dataScopeFilterService.appendCurrentUserStationScope(sql, paramMap, "wt.RSTCD"); if (scopeApplyResult.isEmptyResult()) { dataSourceResult.setData(new ArrayList<>()); dataSourceResult.setTotal(0L); diff --git a/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java b/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java index 32c2229b..e7e6c97b 100644 --- a/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/system/service/impl/SysMenuServiceImpl.java @@ -76,30 +76,65 @@ public class SysMenuServiceImpl extends ServiceImpl impl String name, String isdisplay, String tenantId) { - List> mapList=null; - List> listMap =new ArrayList<>(); - if(StrUtil.isEmpty(name)){//不带名称查询,返回树结构 + if (StrUtil.isEmpty(name)) { + // 一次查询该系统下所有菜单,内存中构建树(替代递归逐层查 DB) QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("parentid", "0").eq("systemcode", systemcode) + queryWrapper.eq("systemcode", systemcode) .eq(StrUtil.isNotBlank(tenantId), "tenant_id", tenantId) .orderByAsc("orderno"); - mapList = this.listMaps(queryWrapper); - listMap.addAll(ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList)); - for (int i = 0; i < listMap.size(); i++) { - //查询下一子集 - List> childList = child(listMap.get(i).get( - "id").toString(), systemcode, name, null, null, tenantId); - listMap.get(i).put("children", childList); //添加新列 子集 + List> allMenus = this.listMaps(queryWrapper); + List> allConverted = ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, allMenus); + + // 构建 id -> node 索引,并预初始化 children 空列表 + Map> nodeMap = new LinkedHashMap<>(); + for (Map menu : allConverted) { + menu.put("children", new ArrayList<>()); + nodeMap.put(String.valueOf(menu.get("id")), menu); } - }else{ //根据菜单名称查询,直接返回类别 + + // 单次遍历挂载子节点到父节点 + List> roots = new ArrayList<>(); + for (Map menu : allConverted) { + String parentId = String.valueOf(menu.get("parentid")); + Map parent = nodeMap.get(parentId); + if (parent != null) { +// @SuppressWarnings("unchecked") + List> children = (List>) parent.get("children"); + children.add(menu); + } else { + roots.add(menu); + } + } + + // 递归按 orderno 排序 + sortTreeByOrderno(roots); + return roots; + } else { + // 根据菜单名称查询,直接返回列表 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.like("name", name).eq("systemcode", systemcode) .eq(StrUtil.isNotBlank(tenantId), "tenant_id", tenantId) .orderByAsc("name"); - mapList = this.listMaps(queryWrapper); - listMap.addAll(ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList)); + List> mapList = this.listMaps(queryWrapper); + return ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList); + } + } + + /** + * 递归按 orderno 排序树节点(保持与原 child() 相同的排序语义) + */ + private void sortTreeByOrderno(List> nodes) { + nodes.sort(Comparator.comparingInt(m -> { + Object orderno = m.get("orderno"); + return orderno instanceof Number ? ((Number) orderno).intValue() : 0; + })); + for (Map node : nodes) { + @SuppressWarnings("unchecked") + List> children = (List>) node.get("children"); + if (children != null && !children.isEmpty()) { + sortTreeByOrderno(children); + } } - return listMap; } /*********************************** diff --git a/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml b/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml index 3d40173f..5084ec4a 100644 --- a/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml +++ b/backend/src/main/resources/mapper/qgc_base/SdRvcdDicMapper.xml @@ -53,83 +53,97 @@ ORDER BY ORDER_INDEX ASC + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +