diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java index 89d4548e..96a9e23c 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java @@ -41,6 +41,34 @@ public interface MsMapmoduleBMapper extends BaseMapper { List getMapLayerTree(@Param("moduleId") String moduleId, @Param("sid") String sid, @Param("templateId") String templateId); + /** + * 按模块ID集合查询地图图层树(用于非管理员按用户菜单权限取图层) + */ + @Select("") + List getMapLayerTreeByModuleIds(@Param("moduleIds") List moduleIds, @Param("sid") String sid, + @Param("templateId") String templateId); + /** * 查询地图工具箱(关联MS_MAPMODULE_B与MS_MAPTOOLBOX_B) */ @@ -132,4 +160,4 @@ public interface MsMapmoduleBMapper extends BaseMapper { ")\n" + "AND IS_DELETED = 0") MsMapmoduleB selectLayerById(@Param("id") String id); -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLayerBizServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLayerBizServiceImpl.java index 0bab5095..059bcdd0 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLayerBizServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLayerBizServiceImpl.java @@ -8,12 +8,16 @@ import com.yfd.platform.qgc_sys.mapLayer.entity.vo.MapLayerVo; import com.yfd.platform.qgc_sys.mapLayer.mapper.MsMaplayerBMapper; import com.yfd.platform.qgc_sys.mapLayer.mapper.MsMapmoduleBMapper; import com.yfd.platform.qgc_sys.mapLayer.service.IMapLayerBizService; +import com.yfd.platform.system.domain.SysMenu; import com.yfd.platform.system.domain.SysDictionary; import com.yfd.platform.system.domain.SysDictionaryItems; import com.yfd.platform.system.domain.SysUser; import com.yfd.platform.system.mapper.SysDictionaryItemsMapper; import com.yfd.platform.system.mapper.SysDictionaryMapper; +import com.yfd.platform.system.mapper.SysMenuMapper; import com.yfd.platform.system.mapper.SysUserMapper; +import com.yfd.platform.system.service.IAdminAuthService; +import com.yfd.platform.utils.SecurityUtils; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -43,6 +47,12 @@ public class MapLayerBizServiceImpl implements IMapLayerBizService { @Resource private MsMapmoduleBMapper msMapmoduleBMapper; + @Resource + private SysMenuMapper sysMenuMapper; + + @Resource + private IAdminAuthService adminAuthService; + @Override public List getMapLayerTree(MapLayerAo flag) { // 1. 查询字典 "DTZJLX" 获取需要排除的图层类型 @@ -173,13 +183,24 @@ public class MapLayerBizServiceImpl implements IMapLayerBizService { @Override public List getMapLayerTree(String moduleId, String systemId, String templateId) { - // 通过 JOIN 查询 MS_MAPLAYER_B 和 MS_MAPMODULE_B - List allLayers = msMapmoduleBMapper.getMapLayerTree(moduleId, systemId, templateId); + List allLayers; + if (adminAuthService.isCurrentManagedAdmin()) { + allLayers = msMapmoduleBMapper.getMapLayerTree(moduleId, systemId, templateId); + } else { + List currentUserModuleIds = getCurrentUserModuleIds(); + if (currentUserModuleIds.isEmpty()) { + return new ArrayList<>(); + } + allLayers = msMapmoduleBMapper.getMapLayerTreeByModuleIds(currentUserModuleIds, systemId, templateId); + allLayers = supplementMissingParentLayers(allLayers); + } if (allLayers == null || allLayers.isEmpty()) { return new ArrayList<>(); } + allLayers = sortMapLayerVos(allLayers); + // 取第一级 List parents = allLayers.stream() .filter(p -> StrUtil.isBlank(p.getParentId())) @@ -211,4 +232,105 @@ public class MapLayerBizServiceImpl implements IMapLayerBizService { } } } -} \ No newline at end of file + + private List getCurrentUserModuleIds() { + String userId = SecurityUtils.getUserId(); + if (StrUtil.isBlank(userId)) { + return new ArrayList<>(); + } + List userMenus = sysMenuMapper.selectMenuByUserId(userId, null); + if (userMenus == null || userMenus.isEmpty()) { + return new ArrayList<>(); + } + return userMenus.stream() + .map(SysMenu::getId) + .filter(StrUtil::isNotBlank) + .distinct() + .collect(Collectors.toList()); + } + + private List supplementMissingParentLayers(List layers) { + if (layers == null || layers.isEmpty()) { + return new ArrayList<>(); + } + List result = new ArrayList<>(layers); + Set existingIds = result.stream() + .map(MapLayerVo::getId) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toCollection(LinkedHashSet::new)); + Set pendingParentIds = result.stream() + .map(MapLayerVo::getParentId) + .filter(StrUtil::isNotBlank) + .filter(parentId -> !existingIds.contains(parentId)) + .collect(Collectors.toCollection(LinkedHashSet::new)); + while (!pendingParentIds.isEmpty()) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(MsMaplayerB::getId, pendingParentIds) + .eq(MsMaplayerB::getIsDeleted, 0) + .eq(MsMaplayerB::getEnable, 1) + .and(w -> w.notIn(MsMaplayerB::getType, "YXDT", "DXDT", "SLDT").or().isNull(MsMaplayerB::getType)) + .orderByAsc(MsMaplayerB::getOrderIndex); + List parentLayers = msMaplayerBMapper.selectList(wrapper); + if (parentLayers == null || parentLayers.isEmpty()) { + break; + } + Set nextParentIds = new LinkedHashSet<>(); + for (MsMaplayerB parentLayer : parentLayers) { + if (parentLayer == null || StrUtil.isBlank(parentLayer.getId()) || existingIds.contains(parentLayer.getId())) { + continue; + } + result.add(toMapLayerVo(parentLayer)); + existingIds.add(parentLayer.getId()); + if (StrUtil.isNotBlank(parentLayer.getParentId()) && !existingIds.contains(parentLayer.getParentId())) { + nextParentIds.add(parentLayer.getParentId()); + } + } + pendingParentIds = nextParentIds; + } + return result; + } + + private List sortMapLayerVos(List layers) { + return layers.stream() + .sorted(Comparator + .comparingInt((MapLayerVo item) -> parseOrderIndex(item.getOrderIndex())) + .thenComparing(item -> StrUtil.nullToDefault(item.getId(), ""))) + .collect(Collectors.toList()); + } + + private int parseOrderIndex(String orderIndex) { + if (StrUtil.isBlank(orderIndex)) { + return Integer.MAX_VALUE; + } + try { + return Integer.parseInt(orderIndex); + } catch (NumberFormatException ex) { + return Integer.MAX_VALUE; + } + } + + private MapLayerVo toMapLayerVo(MsMaplayerB layer) { + MapLayerVo vo = new MapLayerVo(); + vo.setId(layer.getId()); + vo.setParentId(layer.getParentId()); + vo.setTitle(layer.getTitle()); + vo.setCode(layer.getCode()); + vo.setLabelLevel(layer.getLabelLevel()); + vo.setCheckable(layer.getCheckable()); + vo.setType(layer.getType()); + vo.setZIndex(layer.getZIndex()); + vo.setSttpType(layer.getSttpType()); + vo.setLayers(layer.getLayers()); + vo.setUrl(layer.getUrl()); + vo.setUrlThd(layer.getUrlThd()); + vo.setOpacity(layer.getOpacity()); + vo.setParamJson(layer.getParamJson()); + vo.setAnchorParamJson(layer.getAnchorParamJson()); + vo.setOptions(layer.getOptions()); + vo.setOrderIndex(layer.getOrderIndex() == null ? null : String.valueOf(layer.getOrderIndex())); + vo.setChecked(0); + vo.setCanBeChecked(0); + vo.setMultiSelect(1); + return vo; + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/service/impl/MapmoduleBServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/service/impl/MapmoduleBServiceImpl.java index bef9a830..4aef2f86 100644 --- a/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/service/impl/MapmoduleBServiceImpl.java +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/service/impl/MapmoduleBServiceImpl.java @@ -136,13 +136,9 @@ public class MapmoduleBServiceImpl extends ServiceImpl layer; - if (hasCurrentUserModulePermission(mapmoduleB.getModuleId())) { - layer = mapLayerBizService.getMapLayerTree( - mapmoduleB.getModuleId(), mapmoduleB.getSystemId(), templateId); - } else { - layer = new ArrayList<>(); - } + List layer = mapLayerBizService.getMapLayerTree( + mapmoduleB.getModuleId(), mapmoduleB.getSystemId(), templateId);; + mapmoduleVo.setMapLayerVos(layer); // 2. 地图图例