fix: 优化页面bug

This commit is contained in:
tangwei 2026-08-04 17:19:25 +08:00
parent 18f91f3a61
commit d35eb47d73
5 changed files with 182 additions and 128 deletions

View File

@ -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<String, List<SdEngInfoBH>> rvcdEngMap = new HashMap<>();
for (SdRvcdDic rvcdDic : rvcdList) {
List<SdEngInfoBH> 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<String> rvcdCodeList = rvcdList.stream()
.map(SdRvcdDic::getRvcd)
.collect(Collectors.toList());
List<SdEngInfoBH> allEngList = engInfoBHMapper.selectList(new LambdaQueryWrapper<SdEngInfoBH>().in(SdEngInfoBH::getReachcd, rvcdCodeList));
// List<SdEngInfoBH> allEngList = engInfoBHMapper.selectByRvcdList(rvcdCodeList);
if (engList != null && !engList.isEmpty()) {
rvcdEngMap.put(rvcdDic.getRvcd(), engList);
// 3. 按流域分组同时在内存中过滤电站名称
Map<String, List<SdEngInfoBH>> 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<SdEngInfoBH> engList = rvcdEngMap.get(rvcdDic.getRvcd());
if (engList == null || engList.isEmpty()) {
continue;
}
Map<String, Object> 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<SdEngInfoBH> engList = rvcdEngMap.get(rvcdDic.getRvcd());
List<Map<String, Object>> engChildren = new ArrayList<>();
if (engList != null && !engList.isEmpty()) {
for (SdEngInfoBH eng : engList) {
Map<String, Object> 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<Map<String, Object>> engChildren = new ArrayList<>(engList.size());
for (SdEngInfoBH eng : engList) {
Map<String, Object> 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;

View File

@ -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<VdPointVo> 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<VdPointVo> list = microservicDynamicSQLMapper.pageAllListWithResultType(
page, sql.toString(), paramMap, VdPointVo.class);
result.setData(list);

View File

@ -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);

View File

@ -76,30 +76,65 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
String name,
String isdisplay,
String tenantId) {
List<Map<String, Object>> mapList=null;
List<Map<String, Object>> listMap =new ArrayList<>();
if(StrUtil.isEmpty(name)){//不带名称查询返回树结构
if (StrUtil.isEmpty(name)) {
// 一次查询该系统下所有菜单内存中构建树替代递归逐层查 DB
QueryWrapper<SysMenu> 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<Map<String, Object>> childList = child(listMap.get(i).get(
"id").toString(), systemcode, name, null, null, tenantId);
listMap.get(i).put("children", childList); //添加新列 子集
List<Map<String, Object>> allMenus = this.listMaps(queryWrapper);
List<Map<String, Object>> allConverted = ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, allMenus);
// 构建 id -> node 索引并预初始化 children 空列表
Map<String, Map<String, Object>> nodeMap = new LinkedHashMap<>();
for (Map<String, Object> menu : allConverted) {
menu.put("children", new ArrayList<>());
nodeMap.put(String.valueOf(menu.get("id")), menu);
}
}else{ //根据菜单名称查询直接返回类别
// 单次遍历挂载子节点到父节点
List<Map<String, Object>> roots = new ArrayList<>();
for (Map<String, Object> menu : allConverted) {
String parentId = String.valueOf(menu.get("parentid"));
Map<String, Object> parent = nodeMap.get(parentId);
if (parent != null) {
// @SuppressWarnings("unchecked")
List<Map<String, Object>> children = (List<Map<String, Object>>) parent.get("children");
children.add(menu);
} else {
roots.add(menu);
}
}
// 递归按 orderno 排序
sortTreeByOrderno(roots);
return roots;
} else {
// 根据菜单名称查询直接返回列表
QueryWrapper<SysMenu> 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<Map<String, Object>> mapList = this.listMaps(queryWrapper);
return ObjectConverterUtil.convertMapFieldsToEntityFormat(SysMenu.class, mapList);
}
}
/**
* 递归按 orderno 排序树节点保持与原 child() 相同的排序语义
*/
private void sortTreeByOrderno(List<Map<String, Object>> nodes) {
nodes.sort(Comparator.comparingInt(m -> {
Object orderno = m.get("orderno");
return orderno instanceof Number ? ((Number) orderno).intValue() : 0;
}));
for (Map<String, Object> node : nodes) {
@SuppressWarnings("unchecked")
List<Map<String, Object>> children = (List<Map<String, Object>>) node.get("children");
if (children != null && !children.isEmpty()) {
sortTreeByOrderno(children);
}
}
return listMap;
}
/***********************************

View File

@ -53,83 +53,97 @@
ORDER BY ORDER_INDEX ASC
</select>
<select id="selectRegDropdown" resultMap="BaseResultMap">
SELECT
t.RVCD,
t.DISPLAY_RVNM AS RVNM,
t.PRVCD,
t.GRD,
t.PATH,
t.ORDER_INDEX,
-- t.LGTD,
-- t.LTTD,
-- t.AREA,
-- t.PERIMETER,
-- t.COUNTRY,
-- t.LOGO,
-- t.INTRODUCE,
-- t.INFFILE,
t.SHORTNAME,
t.SHEPRANGE,
t.BASEID
-- ,
-- t.ENABLED,
-- t.RECORD_USER,
-- t.RECORD_TIME,
-- t.MODIFY_USER,
-- t.MODIFY_TIME,
-- t.IS_DELETED,
-- t.DELETE_USER,
-- t.DELETE_TIME
FROM (
SELECT
d.RVCD,
LTRIM(SYS_CONNECT_BY_PATH(d.RVNM, '-'), '-') AS DISPLAY_RVNM,
d.PRVCD,
d.GRD,
d.PATH,
d.ORDER_INDEX,
-- d.LGTD,
-- d.LTTD,
-- d.AREA,
-- d.PERIMETER,
-- d.COUNTRY,
-- d.LOGO,
-- d.INTRODUCE,
-- d.INFFILE,
d.SHORTNAME,
d.SHEPRANGE,
d.BASEID,
-- d.ENABLED,
-- d.RECORD_USER,
-- d.RECORD_TIME,
-- d.MODIFY_USER,
-- d.MODIFY_TIME,
-- d.IS_DELETED,
-- d.DELETE_USER,
-- d.DELETE_TIME,
SYS_CONNECT_BY_PATH(LPAD(NVL(d.ORDER_INDEX, 999999999), 10, '0'), '/') AS ORDER_PATH,
LEVEL AS TREE_LEVEL
FROM (
SELECT *
FROM SD_RVCD_DIC
WHERE NVL(ENABLED, 1) = 1
AND NVL(IS_DELETED, 0) = 0
) d
START WITH d.PRVCD IS NULL OR d.PRVCD = '' OR d.PRVCD = '0'
CONNECT BY PRIOR d.RVCD = d.PRVCD
ORDER SIBLINGS BY d.ORDER_INDEX ASC, d.RVCD ASC
) t
WHERE t.TREE_LEVEL > 1
SELECT *
FROM V_SD_RVCD_DIC_TREE
WHERE 1=1
<if test="rvcd != null and rvcd != ''">
AND t.RVCD = #{rvcd}
AND RVCD = #{rvcd}
</if>
<if test="rvnm != null and rvnm != ''">
AND t.DISPLAY_RVNM LIKE '%' || #{rvnm} || '%'
AND RVNM LIKE '%' || #{rvnm} || '%'
</if>
ORDER BY t.ORDER_PATH ASC, t.RVCD ASC
ORDER BY ORDER_PATH ASC, RVCD ASC
</select>
<!-- <select id="selectRegDropdown" resultMap="BaseResultMap">-->
<!-- SELECT-->
<!-- t.RVCD,-->
<!-- t.DISPLAY_RVNM AS RVNM,-->
<!-- t.PRVCD,-->
<!-- t.GRD,-->
<!-- t.PATH,-->
<!-- t.ORDER_INDEX,-->
<!--&#45;&#45; t.LGTD,-->
<!--&#45;&#45; t.LTTD,-->
<!--&#45;&#45; t.AREA,-->
<!--&#45;&#45; t.PERIMETER,-->
<!--&#45;&#45; t.COUNTRY,-->
<!--&#45;&#45; t.LOGO,-->
<!--&#45;&#45; t.INTRODUCE,-->
<!--&#45;&#45; t.INFFILE,-->
<!-- t.SHORTNAME,-->
<!-- t.SHEPRANGE,-->
<!-- t.BASEID-->
<!--&#45;&#45; ,-->
<!--&#45;&#45; t.ENABLED,-->
<!--&#45;&#45; t.RECORD_USER,-->
<!--&#45;&#45; t.RECORD_TIME,-->
<!--&#45;&#45; t.MODIFY_USER,-->
<!--&#45;&#45; t.MODIFY_TIME,-->
<!--&#45;&#45; t.IS_DELETED,-->
<!--&#45;&#45; t.DELETE_USER,-->
<!--&#45;&#45; t.DELETE_TIME-->
<!-- FROM (-->
<!-- SELECT-->
<!-- d.RVCD,-->
<!-- LTRIM(SYS_CONNECT_BY_PATH(d.RVNM, '-'), '-') AS DISPLAY_RVNM,-->
<!-- d.PRVCD,-->
<!-- d.GRD,-->
<!-- d.PATH,-->
<!-- d.ORDER_INDEX,-->
<!--&#45;&#45; d.LGTD,-->
<!--&#45;&#45; d.LTTD,-->
<!--&#45;&#45; d.AREA,-->
<!--&#45;&#45; d.PERIMETER,-->
<!--&#45;&#45; d.COUNTRY,-->
<!--&#45;&#45; d.LOGO,-->
<!--&#45;&#45; d.INTRODUCE,-->
<!--&#45;&#45; d.INFFILE,-->
<!-- d.SHORTNAME,-->
<!-- d.SHEPRANGE,-->
<!-- d.BASEID,-->
<!--&#45;&#45; d.ENABLED,-->
<!--&#45;&#45; d.RECORD_USER,-->
<!--&#45;&#45; d.RECORD_TIME,-->
<!--&#45;&#45; d.MODIFY_USER,-->
<!--&#45;&#45; d.MODIFY_TIME,-->
<!--&#45;&#45; d.IS_DELETED,-->
<!--&#45;&#45; d.DELETE_USER,-->
<!--&#45;&#45; d.DELETE_TIME,-->
<!-- SYS_CONNECT_BY_PATH(LPAD(NVL(d.ORDER_INDEX, 999999999), 10, '0'), '/') AS ORDER_PATH,-->
<!-- LEVEL AS TREE_LEVEL-->
<!-- FROM (-->
<!-- SELECT *-->
<!-- FROM SD_RVCD_DIC-->
<!-- WHERE NVL(ENABLED, 1) = 1-->
<!-- AND NVL(IS_DELETED, 0) = 0-->
<!-- ) d-->
<!-- START WITH d.PRVCD IS NULL OR d.PRVCD = '' OR d.PRVCD = '0'-->
<!-- CONNECT BY PRIOR d.RVCD = d.PRVCD-->
<!-- ORDER SIBLINGS BY d.ORDER_INDEX ASC, d.RVCD ASC-->
<!-- ) t-->
<!-- WHERE t.TREE_LEVEL > 1-->
<!-- <if test="rvcd != null and rvcd != ''">-->
<!-- AND t.RVCD = #{rvcd}-->
<!-- </if>-->
<!-- <if test="rvnm != null and rvnm != ''">-->
<!-- AND t.DISPLAY_RVNM LIKE '%' || #{rvnm} || '%'-->
<!-- </if>-->
<!-- ORDER BY t.ORDER_PATH ASC, t.RVCD ASC-->
<!-- </select>-->
<select id="selectRegDropdownWithEng" resultMap="BaseResultMap">
SELECT
t.RVCD,