From 4ad2014e6128a256414ab0a63462f00b676592ec Mon Sep 17 00:00:00 2001 From: lilin <18811154576@163.com> Date: Wed, 17 Jun 2026 11:42:49 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=BE=E5=B1=82=E7=AE=A1=E7=90=86=E5=9B=BE?= =?UTF-8?q?=E4=BE=8B=E7=AE=A1=E7=90=86=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=EF=BC=8C=E6=9F=A5=E8=AF=A2=20=E6=96=B0=E5=A2=9E=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yfd/platform/config/SecurityConfig.java | 2 + .../yfd/platform/config/SwaggerConfig.java | 16 ++ .../controller/MapLayerController.java | 71 +++++ .../controller/MapLegendController.java | 102 +++++++ .../qgc_sys/mapLayer/domain/MsMaplayerB.java | 191 +++++++++++++ .../qgc_sys/mapLayer/domain/MsMaplegendB.java | 134 +++++++++ .../qgc_sys/mapLayer/domain/MsMapmoduleB.java | 95 +++++++ .../mapLayer/entity/vo/MapLayerAo.java | 15 + .../mapLayer/mapper/MsMaplayerBMapper.java | 14 + .../mapLayer/mapper/MsMaplegendBMapper.java | 14 + .../mapLayer/mapper/MsMapmoduleBMapper.java | 14 + .../mapLayer/service/IMapLayerBizService.java | 22 ++ .../mapLayer/service/IMapLayerService.java | 28 ++ .../mapLayer/service/IMapLegendService.java | 22 ++ .../service/impl/MapLayerBizServiceImpl.java | 165 +++++++++++ .../service/impl/MapLayerServiceImpl.java | 256 ++++++++++++++++++ .../service/impl/MapLegendServiceImpl.java | 97 +++++++ .../controller/MapmoduleBController.java | 101 +++++++ .../mapcfg/service/IMapmoduleBService.java | 36 +++ .../service/impl/MapmoduleBServiceImpl.java | 92 +++++++ 20 files changed, 1487 insertions(+) create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLayerController.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMaplayerB.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMaplegendB.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMapmoduleB.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/entity/vo/MapLayerAo.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMaplayerBMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMaplegendBMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/IMapLayerBizService.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/IMapLayerService.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/IMapLegendService.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLayerBizServiceImpl.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLayerServiceImpl.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/controller/MapmoduleBController.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/service/IMapmoduleBService.java create mode 100644 backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/service/impl/MapmoduleBServiceImpl.java diff --git a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java index 79a4e331..d0fca320 100644 --- a/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SecurityConfig.java @@ -71,6 +71,8 @@ public class SecurityConfig { // .requestMatchers("/fp/**").permitAll() // .requestMatchers("/fh/**").permitAll() // .requestMatchers("/data/**").permitAll() + .requestMatchers("/mapLayer/**").permitAll() + .requestMatchers("/mapLegend/**").permitAll() .requestMatchers("/sms/**").permitAll() .requestMatchers(HttpMethod.GET, "/").permitAll() .requestMatchers(HttpMethod.GET, diff --git a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java index 443e06a6..c07a6cf5 100644 --- a/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java +++ b/backend/src/main/java/com/yfd/platform/config/SwaggerConfig.java @@ -146,4 +146,20 @@ public class SwaggerConfig { .packagesToScan("com.yfd.platform.qgc_eng.eq.controller") .build(); } + + @Bean + public GroupedOpenApi groupSysApi() { + return GroupedOpenApi.builder() + .group("5. 图层管理") + .packagesToScan("com.yfd.platform.qgc_sys.mapLayer.controller") + .build(); + } + + @Bean + public GroupedOpenApi groupSysMlgApi() { + return GroupedOpenApi.builder() + .group("5.1 图例结构管理") + .packagesToScan("com.yfd.platform.qgc_sys.mapLegend.controller") + .build(); + } } \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLayerController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLayerController.java new file mode 100644 index 00000000..981346ce --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLayerController.java @@ -0,0 +1,71 @@ +package com.yfd.platform.qgc_sys.mapLayer.controller; + +import cn.hutool.core.util.StrUtil; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMaplayerB; +import com.yfd.platform.qgc_sys.mapLayer.entity.vo.MapLayerAo; +import com.yfd.platform.qgc_sys.mapLayer.service.IMapLayerBizService; +import com.yfd.platform.qgc_sys.mapLayer.service.IMapLayerService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 地图图层管理 + * + * @author migration + */ +@RestController +@RequestMapping("/mapLayer") +@Tag(name = "地图图层管理") +public class MapLayerController { + + @Resource + private IMapLayerBizService mapLayerBizService; + + @Resource + private IMapLayerService layerService; + + /** + * 地图图层管理图层树(所有) + */ + @Operation(summary = "地图图层管理图层树(所有)") + @PostMapping("/getAllMapLayerTree") + public ResponseResult getAllMapLayerTree(@RequestBody MapLayerAo flag) { + List tree = mapLayerBizService.getMapLayerTree(flag); + return ResponseResult.successData(tree); + } + + /** + * 图层新增修改 + */ + @Operation(summary = "图层新增修改") + @PostMapping("/save") + public ResponseResult addLayer(@RequestBody MsMaplayerB layer) { + if (layer == null) { + return ResponseResult.error("图层信息不能为空."); + } + if (StrUtil.isBlank(layer.getCode())) { + throw new BizException("图层编码(code)不能为空."); + } + if (StrUtil.isBlank(layer.getTitle())) { + throw new BizException("图层名称(title)不能为空."); + } + layerService.saveOrUpdate(layer); + return ResponseResult.success("保存成功."); + } + + /** + * 图层删除 + */ + @Operation(summary = "图层删除") + @PostMapping("/delete") + public ResponseResult deleteLayer(@RequestBody List ids) { + layerService.delelteByIds(ids); + return ResponseResult.success("删除成功."); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java new file mode 100644 index 00000000..f038b8e7 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/controller/MapLegendController.java @@ -0,0 +1,102 @@ +package com.yfd.platform.qgc_sys.mapLayer.controller; + + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMaplegendB; +import com.yfd.platform.qgc_sys.mapLayer.service.IMapLegendService; +import com.yfd.platform.utils.DataSourceRequestUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 地图图例管理 + * + * @author migration + */ +@RestController +@RequestMapping("/mapLegend") +@Tag(name = "地图图例管理") +public class MapLegendController { + + @Resource + private IMapLegendService mapLegendService; + + /** + * 条件过滤数据列表(Kendo UI 数据源) + */ + @Operation(summary = "条件过滤数据列表") + @PostMapping("/GetKendoList") + public ResponseResult getKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + // 构建查询条件 + QueryWrapper wrapper = DataSourceRequestUtil.buildQueryWrapper( + dataSourceRequest, MsMaplegendB.class); + + // 执行分页查询 + Page page = DataSourceRequestUtil.getPage(dataSourceRequest); + Page resultPage; + if (page != null) { + resultPage = mapLegendService.page(page, wrapper); + } else { + List list = mapLegendService.list(wrapper); + resultPage = new Page<>(); + resultPage.setRecords(list); + resultPage.setTotal(list.size()); + } + + // 构建 Kendo 数据源结果 + DataSourceResult dataSourceResult = new DataSourceResult<>(); + dataSourceResult.setData(resultPage.getRecords()); + dataSourceResult.setTotal(resultPage.getTotal()); + + return ResponseResult.successData(dataSourceResult); + } + + /** + * 图例新增修改 + */ + @Operation(summary = "图例新增修改") + @PostMapping("/save") + public ResponseResult addLayer(@RequestBody MsMaplegendB legend) { + if (legend == null) { + return ResponseResult.error("图例信息不能为空."); + } + if (StrUtil.isBlank(legend.getCode())) { + throw new BizException("图例类型(code: pointLayer=用于锚点,baseLayer=地图GIS)不能为空."); + } + if (StrUtil.isBlank(legend.getName())) { + throw new BizException("图例名称(name)不能为空."); + } + if (StrUtil.isBlank(legend.getNameEn())) { + throw new BizException("图例编码(nameEn)不能为空."); + } + if (legend.getDataType() == null) { + throw new BizException("图例数据类型(dataType: 1=结构,2=数据)不能为空."); + } + if (legend.getDataType() == 2 && StrUtil.isBlank(legend.getLayerCode())) { + throw new BizException("关联的图层编码(layerCode)不能为空."); + } + mapLegendService.saveOrUpdate(legend); + return ResponseResult.success("保存成功."); + } + + /** + * 图例删除 + */ + @Operation(summary = "图例删除") + @PostMapping("/delete") + public ResponseResult deleteLayer(@RequestBody List ids) { + mapLegendService.delelteByIds(ids); + return ResponseResult.success("删除成功."); + } +} diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMaplayerB.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMaplayerB.java new file mode 100644 index 00000000..25904a0b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMaplayerB.java @@ -0,0 +1,191 @@ +package com.yfd.platform.qgc_sys.mapLayer.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; + +/** + * 地图图层表 + * + * @author migration + */ +@Data +@TableName("MS_MAPLAYER_B") +public class MsMaplayerB implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + /** 类型 */ + @TableField("TYPE") + private String type; + + /** 标识字段 */ + @TableField("KEY") + private String key; + + /** 编码 */ + @TableField("CODE") + private String code; + + /** 名称 */ + @TableField("TITLE") + private String title; + + /** 名称英文 */ + @TableField("TITLE_EN") + private String titleEn; + + /** 所属父节点 */ + @TableField("PARENT_ID") + private String parentId; + + /** 树全路径 */ + @TableField("FULL_PATH") + private String fullPath; + + /** 层级 */ + @TableField("TREE_LEVEL") + private Integer treeLevel; + + /** 是否有子集:0=否 1=有 */ + @TableField("HAS_CHILDREN") + private Integer hasChildren; + + /** 对应锚点接口 */ + @TableField("URL") + private String url; + + /** 对应三维锚点接口 */ + @TableField("URL_THD") + private String urlThd; + + /** 参数设置 */ + @TableField("OPTIONS") + private String options; + + /** 访问令牌 */ + @TableField("TOKEN") + private String token; + + /** 用户名 */ + @TableField("USERNAME") + private String username; + + /** 密码 */ + @TableField("PASSWORD") + private String password; + + /** 地图中心点经度 */ + @TableField("CENTER_LGTD") + private BigDecimal centerLgtd; + + /** 地图中心点纬度 */ + @TableField("CENTER_LTTD") + private BigDecimal centerLttd; + + /** 默认缩放级别 */ + @TableField("DEFAULT_ZOOM") + private String defaultZoom; + + /** 所属国家 */ + @TableField("COUNTRY") + private String country; + + /** 图标 */ + @TableField("ICON") + private String icon; + + /** 是否可选择:0=否 1=是 */ + @TableField("CHECKABLE") + private Integer checkable; + + /** 图层上下层层级关系 */ + @TableField("Z_INDEX") + private String zIndex; + + /** 各类站点图层对应类型 */ + @TableField("STTP_TYPE") + private String sttpType; + + /** 图层展示数据格式 */ + @TableField("LAYERS") + private String layers; + + /** 图层透明度 */ + @TableField("OPACITY") + private BigDecimal opacity; + + /** 额外参数 */ + @TableField("PARAMJSON") + private String paramJson; + + /** 备注 */ + @TableField("DESCRIPTION") + private String description; + + /** 是否启用:0=禁用 1=启用 */ + @TableField("ENABLE") + private Integer enable; + + /** 排序 */ + @TableField("ORDER_INDEX") + private Integer orderIndex; + + /** 过滤内容 */ + @TableField("FILTER_CONTENT") + private String filterContent; + + /** 创建人 */ + @TableField("RECORD_USER") + private String recordUser; + + /** 创建时间 */ + @TableField("RECORD_TIME") + private Date recordTime; + + /** 更新人 */ + @TableField("MODIFY_USER") + private String modifyUser; + + /** 更新时间 */ + @TableField("MODIFY_TIME") + private Date modifyTime; + + /** 是否已删除:0=未删除 1=已删除 */ + @TableField("IS_DELETED") + private Integer isDeleted; + + /** 删除人 */ + @TableField("DELETE_USER") + private String deleteUser; + + /** 删除时间 */ + @TableField("DELETE_TIME") + private Date deleteTime; + + /** 数据类型:1=结构,2=数据 */ + @TableField("DATA_TYPE") + private Integer dataType; + + /** 标签层级 */ + @TableField("LABEL_LEVEL") + private Integer labelLevel; + + /** 子级集合(非数据库字段) */ + @TableField(exist = false) + private List children; + + /** 创建人名称(非数据库字段) */ + @TableField(exist = false) + private String displayRecordUser; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMaplegendB.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMaplegendB.java new file mode 100644 index 00000000..6147f6c3 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMaplegendB.java @@ -0,0 +1,134 @@ +package com.yfd.platform.qgc_sys.mapLayer.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 地图图例表 + * + * @author migration + */ +@Data +@TableName("MS_MAPLEGEND_B") +public class MsMaplegendB implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + @TableField("NAME") + private String name; + + @TableField("NAME_EN") + private String nameEn; + + @TableField("CODE") + private String code; + + @TableField("ICON") + private String icon; + + @TableField("GROUP_NAME") + private String groupName; + + @TableField("PARENT_NAME") + private String parentName; + + @TableField("LAYER_CODE") + private String layerCode; + + @TableField("MIN_ZOOM") + private Integer minZoom; + + @TableField("MAX_ZOOM") + private Integer maxZoom; + + @TableField("MIN_HEIGHT_THD") + private BigDecimal minHeightThd; + + @TableField("MAX_HEIGHT_THD") + private BigDecimal maxHeightThd; + + @TableField("DESCRIPTION") + private String description; + + @TableField("ENABLE") + private Integer enable; + + @TableField("INTERNAL") + private Integer internal; + + @TableField("ORDER_INDEX") + private Integer orderIndex; + + @TableField("FILTER_CONTENT") + private String filterContent; + + @TableField("RECORD_USER") + private String recordUser; + + @TableField("RECORD_TIME") + private Date recordTime; + + @TableField("MODIFY_USER") + private String modifyUser; + + @TableField("MODIFY_TIME") + private Date modifyTime; + + @TableField("IS_DELETED") + private Integer isDeleted; + + @TableField("DELETE_USER") + private String deleteUser; + + @TableField("DELETE_TIME") + private Date deleteTime; + + @TableField("IF_SHOW") + private Integer ifShow; + + @TableField("EXPRESSION") + private String expression; + + @TableField("EXT") + private String ext; + + @TableField("DATA_TYPE") + private Integer dataType; + + @TableField("PARENT_ID") + private String parentId; + + @TableField("FULL_PATH") + private String fullPath; + + @TableField("TREE_LEVEL") + private Integer treeLevel; + + @TableField("HAS_CHILDREN") + private Integer hasChildren; + + @TableField("COLOR") + private String color; + + @TableField("SHAPE") + private String shape; + + @TableField("MIN_VAL") + private BigDecimal minVal; + + @TableField("MAX_VAL") + private BigDecimal maxVal; + + @TableField("IS_FILTER") + private Integer isFilter; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMapmoduleB.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMapmoduleB.java new file mode 100644 index 00000000..aac57f40 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/domain/MsMapmoduleB.java @@ -0,0 +1,95 @@ +package com.yfd.platform.qgc_sys.mapLayer.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 地图与菜单映射表 + * + * @author migration + */ +@Data +@TableName("MS_MAPMODULE_B") +public class MsMapmoduleB implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + @TableField("MODULE_ID") + private String moduleId; + + @TableField("RES_TYPE") + private String resType; + + @TableField("RES_ID") + private String resId; + + @TableField("CHILD_NODE") + private Integer childNode; + + @TableField("MULTI_SELECT") + private Integer multiSelect; + + @TableField("CAN_BE_CHECKED") + private Integer canBeChecked; + + @TableField("CHECKED") + private Integer checked; + + @TableField("DESCRIPTION") + private String description; + + @TableField("ENABLE") + private Integer enable; + + @TableField("ORDER_INDEX") + private Integer orderIndex; + + @TableField("FILTER_CONTENT") + private String filterContent; + + @TableField("RECORD_USER") + private String recordUser; + + @TableField("RECORD_TIME") + private Date recordTime; + + @TableField("MODIFY_USER") + private String modifyUser; + + @TableField("MODIFY_TIME") + private Date modifyTime; + + @TableField("IS_DELETED") + private Integer isDeleted; + + @TableField("DELETE_USER") + private String deleteUser; + + @TableField("DELETE_TIME") + private Date deleteTime; + + @TableField("TEMPLATE_ID") + private String templateId; + + /** + * 归属的系统ID(非数据库字段,用于字典翻译) + */ + @TableField(exist = false) + private String systemId; + + /** + * 菜单名称(非数据库字段,用于字典翻译) + */ + @TableField(exist = false) + private String moduleName; + +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/entity/vo/MapLayerAo.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/entity/vo/MapLayerAo.java new file mode 100644 index 00000000..9d8e38ae --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/entity/vo/MapLayerAo.java @@ -0,0 +1,15 @@ +package com.yfd.platform.qgc_sys.mapLayer.entity.vo; + +import lombok.Data; + +/** + * 地图图层查询参数 + * + * @author migration + */ +@Data +public class MapLayerAo { + + /** 图层名称(模糊查询) */ + private String title; +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMaplayerBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMaplayerBMapper.java new file mode 100644 index 00000000..50a275ec --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMaplayerBMapper.java @@ -0,0 +1,14 @@ +package com.yfd.platform.qgc_sys.mapLayer.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMaplayerB; +import org.apache.ibatis.annotations.Mapper; + +/** + * 地图图层表 Mapper 接口 + * + * @author migration + */ +@Mapper +public interface MsMaplayerBMapper extends BaseMapper { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMaplegendBMapper.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMaplegendBMapper.java new file mode 100644 index 00000000..d6df58bc --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMaplegendBMapper.java @@ -0,0 +1,14 @@ +package com.yfd.platform.qgc_sys.mapLayer.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMaplegendB; +import org.apache.ibatis.annotations.Mapper; + +/** + * 地图图例表 Mapper 接口 + * + * @author migration + */ +@Mapper +public interface MsMaplegendBMapper extends BaseMapper { +} \ No newline at end of file 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 new file mode 100644 index 00000000..774e4c00 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/mapper/MsMapmoduleBMapper.java @@ -0,0 +1,14 @@ +package com.yfd.platform.qgc_sys.mapLayer.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMapmoduleB; +import org.apache.ibatis.annotations.Mapper; + +/** + * 地图与菜单映射表 Mapper 接口 + * + * @author migration + */ +@Mapper +public interface MsMapmoduleBMapper extends BaseMapper { +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/IMapLayerBizService.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/IMapLayerBizService.java new file mode 100644 index 00000000..f0933a77 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/IMapLayerBizService.java @@ -0,0 +1,22 @@ +package com.yfd.platform.qgc_sys.mapLayer.service; + +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMaplayerB; +import com.yfd.platform.qgc_sys.mapLayer.entity.vo.MapLayerAo; + +import java.util.List; + +/** + * 地图图层业务服务接口 + * + * @author migration + */ +public interface IMapLayerBizService { + + /** + * 获取所有地图图层树 + * + * @param flag 查询参数 + * @return 图层树列表 + */ + List getMapLayerTree(MapLayerAo flag); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/IMapLayerService.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/IMapLayerService.java new file mode 100644 index 00000000..7aff13e5 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/IMapLayerService.java @@ -0,0 +1,28 @@ +package com.yfd.platform.qgc_sys.mapLayer.service; + +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMaplayerB; + +import java.util.List; + +/** + * 地图图层基础服务接口 + * + * @author migration + */ +public interface IMapLayerService { + + /** + * 新增或修改图层 + * + * @param layer 图层实体 + * @return 是否成功 + */ + boolean saveOrUpdate(MsMaplayerB layer); + + /** + * 根据ID列表删除图层 + * + * @param ids 图层ID列表 + */ + void delelteByIds(List ids); +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/IMapLegendService.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/IMapLegendService.java new file mode 100644 index 00000000..273398ae --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/IMapLegendService.java @@ -0,0 +1,22 @@ +package com.yfd.platform.qgc_sys.mapLayer.service; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMaplegendB; + +import java.util.List; + +/** + * 地图图例基础服务接口 + * + * @author migration + */ +public interface IMapLegendService extends IService { + + /** + * 根据ID列表删除图例 + * + * @param ids 图例ID列表 + */ + void delelteByIds(List ids); +} \ 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 new file mode 100644 index 00000000..4ba92e0a --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLayerBizServiceImpl.java @@ -0,0 +1,165 @@ +package com.yfd.platform.qgc_sys.mapLayer.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMaplayerB; +import com.yfd.platform.qgc_sys.mapLayer.entity.vo.MapLayerAo; +import com.yfd.platform.qgc_sys.mapLayer.mapper.MsMaplayerBMapper; +import com.yfd.platform.qgc_sys.mapLayer.service.IMapLayerBizService; +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.SysUserMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 地图图层业务服务实现 + * + * @author migration + */ +@Service +public class MapLayerBizServiceImpl implements IMapLayerBizService { + + @Resource + private MsMaplayerBMapper msMaplayerBMapper; + + @Resource + private SysDictionaryMapper sysDictionaryMapper; + + @Resource + private SysDictionaryItemsMapper sysDictionaryItemsMapper; + + @Resource + private SysUserMapper sysUserMapper; + + @Override + public List getMapLayerTree(MapLayerAo flag) { + // 1. 查询字典 "DTZJLX" 获取需要排除的图层类型 + Set excludeTypes = getExcludeTypes(); + + // 2. 查询所有未删除的图层数据,排除特殊类型,支持按名称模糊查询 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MsMaplayerB::getIsDeleted, 0); + + // 排除特殊类型 + if (!excludeTypes.isEmpty()) { + wrapper.and(w -> w.notIn(MsMaplayerB::getType, excludeTypes).or().isNull(MsMaplayerB::getType)); + } + + // 按名称模糊查询 + if (StrUtil.isNotBlank(flag.getTitle())) { + wrapper.like(MsMaplayerB::getTitle, flag.getTitle()); + } + + List mapLayers = msMaplayerBMapper.selectList(wrapper); + + // 3. 当按名称过滤时,补充缺失的父级节点 + if (StrUtil.isNotBlank(flag.getTitle()) && !mapLayers.isEmpty()) { + Set hasKeys = mapLayers.stream() + .filter(it -> StrUtil.isNotBlank(it.getKey())) + .map(MsMaplayerB::getKey) + .collect(Collectors.toSet()); + + Set idList = new HashSet<>(); + for (MsMaplayerB layer : mapLayers) { + if (StrUtil.isNotBlank(layer.getFullPath()) && StrUtil.isNotBlank(layer.getKey())) { + String[] ids = layer.getFullPath().replace(layer.getKey() + ",", "").split(","); + for (String id : ids) { + if (StrUtil.isNotBlank(id) && !hasKeys.contains(id)) { + idList.add(id); + } + } + } + } + + if (!idList.isEmpty()) { + LambdaQueryWrapper parentWrapper = new LambdaQueryWrapper<>(); + parentWrapper.eq(MsMaplayerB::getIsDeleted, 0) + .in(MsMaplayerB::getKey, idList); + List parentLayers = msMaplayerBMapper.selectList(parentWrapper); + if (!parentLayers.isEmpty()) { + mapLayers.addAll(parentLayers); + } + } + } + + // 4. 填充创建人名称 + if (!mapLayers.isEmpty()) { + LambdaQueryWrapper userWrapper = new LambdaQueryWrapper<>(); + List users = sysUserMapper.selectList(userWrapper); + Map userMap = users.stream() + .collect(Collectors.toMap(SysUser::getId, SysUser::getNickname, (v1, v2) -> v1)); + + for (MsMaplayerB layer : mapLayers) { + if (StrUtil.isNotBlank(layer.getRecordUser())) { + layer.setDisplayRecordUser(userMap.get(layer.getRecordUser())); + } + } + } + + // 5. 构建树结构:取第一级 + List parents = mapLayers.stream() + .filter(p -> StrUtil.isBlank(p.getParentId())) + .sorted(Comparator.comparing(MsMaplayerB::getRecordTime, Comparator.nullsLast(Comparator.reverseOrder()))) + .collect(Collectors.toList()); + + // 通过父级id分组子节点 + Map> childrenMap = mapLayers.stream() + .filter(p -> StrUtil.isNotBlank(p.getParentId())) + .collect(Collectors.groupingBy(MsMaplayerB::getParentId)); + + // 递归构建树 + convertTree(parents, childrenMap); + + return parents; + } + + /** + * 查询字典 "DTZJLX" 中需要排除的图层类型值 + */ + private Set getExcludeTypes() { + Set excludeTypes = new HashSet<>(); + try { + LambdaQueryWrapper dictWrapper = new LambdaQueryWrapper<>(); + dictWrapper.eq(SysDictionary::getDictCode, "DTZJLX"); + SysDictionary dictionary = sysDictionaryMapper.selectOne(dictWrapper); + if (dictionary != null) { + LambdaQueryWrapper itemWrapper = new LambdaQueryWrapper<>(); + itemWrapper.eq(SysDictionaryItems::getDictId, dictionary.getId()); + List items = sysDictionaryItemsMapper.selectList(itemWrapper); + if (items != null) { + excludeTypes = items.stream() + .map(SysDictionaryItems::getDictName) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toSet()); + } + } + } catch (Exception e) { + // 字典查询失败时不中断主流程 + } + return excludeTypes; + } + + /** + * 递归转换图层数据为树结构 + */ + private void convertTree(List parents, Map> childrenMap) { + if (parents == null || parents.isEmpty()) { + return; + } + for (MsMaplayerB parent : parents) { + String id = parent.getId(); + List children = childrenMap.get(id); + if (children != null && !children.isEmpty()) { + parent.setChildren(children); + convertTree(children, childrenMap); + } + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLayerServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLayerServiceImpl.java new file mode 100644 index 00000000..fbe64e5b --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLayerServiceImpl.java @@ -0,0 +1,256 @@ +package com.yfd.platform.qgc_sys.mapLayer.service.impl; + +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMaplegendB; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMaplayerB; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMapmoduleB; +import com.yfd.platform.qgc_sys.mapLayer.mapper.MsMaplegendBMapper; +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.IMapLayerService; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 地图图层基础服务实现 + * + * @author migration + */ +@Service +public class MapLayerServiceImpl implements IMapLayerService { + + @Resource + private MsMaplayerBMapper msMaplayerBMapper; + + @Resource + private MsMaplegendBMapper msMaplegendBMapper; + + @Resource + private MsMapmoduleBMapper msMapmoduleBMapper; + + @Override + public boolean saveOrUpdate(MsMaplayerB layer) { + // 校验编码唯一性 + if (hasSameCode(layer)) { + throw new BizException("存在相同编码的数据"); + } + + // 当type等于SLDT/DXDT/YXDT,校验地图json格式 + String paramJson = layer.getParamJson(); + String type = layer.getType(); + if (("SLDT".equals(type) || "DXDT".equals(type) || "YXDT".equals(type)) + && StrUtil.isNotBlank(paramJson)) { + try { + JSONUtil.toBean(paramJson, HashMap.class); + } catch (Exception e) { + throw new BizException("请检查地图json格式"); + } + } + + if (StrUtil.isNotBlank(layer.getId())) { + // 修改 + msMaplayerBMapper.updateById(layer); + + // 判断是否启用且有子级,则子数据都要设置为启用状态 + if (layer.getEnable() != null && layer.getEnable() == 1 + && layer.getHasChildren() != null && layer.getHasChildren() == 1) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MsMaplayerB::getIsDeleted, 0) + .like(MsMaplayerB::getFullPath, layer.getId() + ","); + List children = msMaplayerBMapper.selectList(wrapper); + for (MsMaplayerB child : children) { + MsMaplayerB temp = new MsMaplayerB(); + temp.setId(child.getId()); + temp.setEnable(1); + msMaplayerBMapper.updateById(temp); + } + } + } else { + // 新增 + String id = IdUtil.fastSimpleUUID(); + layer.setId(id); + + // 获取同级子节点,计算最大排序号 + List subList = getSubList(layer.getParentId()); + Integer maxOrderIndex = getMaxOrderIndex(subList); + layer.setOrderIndex(maxOrderIndex + 1); + + MsMaplayerB parentLayer = null; + if (StrUtil.isNotBlank(layer.getParentId())) { + // 获取父级信息 + parentLayer = msMaplayerBMapper.selectById(layer.getParentId()); + if (parentLayer == null) { + throw new BizException("获取父级图层信息失败.请检查父级图层(parentId)是否存在."); + } + // 设置key + layer.setKey(parentLayer.getKey() + "-" + layer.getOrderIndex()); + // 设置fullPath + layer.setFullPath(parentLayer.getFullPath() + layer.getKey() + ","); + // 设置treeLevel + layer.setTreeLevel(parentLayer.getTreeLevel() + 1); + // 设置hasChildren + layer.setHasChildren(0); + } else { + // 无父级,则为创建的顶级图层 + layer.setTreeLevel(1); + layer.setKey("0-" + layer.getOrderIndex()); + layer.setFullPath(layer.getKey() + ","); + layer.setHasChildren(0); + } + + // 设置可选 + layer.setCheckable(0); + // 设置不可用 + layer.setEnable(0); + + String userId = getCurrentUserId(); + layer.setRecordUser(userId); + layer.setModifyUser(userId); + layer.setRecordTime(new Date()); + + msMaplayerBMapper.insert(layer); + + // 新增完成后,设置父级hasChildren为1 + if (parentLayer != null) { + MsMaplayerB temp = new MsMaplayerB(); + temp.setId(parentLayer.getId()); + temp.setHasChildren(1); + msMaplayerBMapper.updateById(temp); + } + } + return true; + } + + @Override + public void delelteByIds(List ids) { + if (ids == null || ids.isEmpty()) { + return; + } + for (String id : ids) { + // 根据id查询是否有子级数据 + MsMaplayerB layer = msMaplayerBMapper.selectById(id); + if (layer == null) { + continue; + } + + LambdaQueryWrapper childWrapper = new LambdaQueryWrapper<>(); + childWrapper.eq(MsMaplayerB::getParentId, id); + List children = msMaplayerBMapper.selectList(childWrapper); + if (!children.isEmpty()) { + throw new BizException("有子级图层,无法删除."); + } + + // 判断是否启用 + if (layer.getEnable() != null && layer.getEnable() == 1) { + throw new BizException("无法删除已启用的图层."); + } + + // 判断是否已经关联了图例 + QueryWrapper legendWrapper = new QueryWrapper<>(); + legendWrapper.eq("LAYER_CODE", layer.getCode()); + legendWrapper.eq("IS_DELETED", 0); + List legendList = msMaplegendBMapper.selectList(legendWrapper); + if (!legendList.isEmpty()) { + throw new BizException("图层关联了图例,无法删除."); + } + + // 判断父级是否存在 + if (StrUtil.isBlank(layer.getParentId())) { + // 逻辑删除 + msMaplayerBMapper.deleteById(id); + } else { + MsMaplayerB parent = msMaplayerBMapper.selectById(layer.getParentId()); + // 逻辑删除 + msMaplayerBMapper.deleteById(id); + + // 判断父级下是否只有一个子级,如果是当前图层,则设置父级hasChildren为0 + if (parent != null) { + LambdaQueryWrapper siblingWrapper = new LambdaQueryWrapper<>(); + siblingWrapper.eq(MsMaplayerB::getParentId, parent.getId()); + List siblings = msMaplayerBMapper.selectList(siblingWrapper); + if (siblings.size() == 1 && id.equals(siblings.get(0).getId())) { + MsMaplayerB temp = new MsMaplayerB(); + temp.setId(parent.getId()); + temp.setHasChildren(0); + msMaplayerBMapper.updateById(temp); + } + } + } + + // 判断是否关联菜单,删除关联 + QueryWrapper moduleWrapper = new QueryWrapper<>(); + moduleWrapper.eq("RES_TYPE", "layer"); + moduleWrapper.eq("IS_DELETED", 0); + moduleWrapper.eq("RES_ID", id); + List moduleList = msMapmoduleBMapper.selectList(moduleWrapper); + if (!moduleList.isEmpty()) { + Set moduleIds = moduleList.stream() + .map(MsMapmoduleB::getId) + .collect(Collectors.toSet()); + msMapmoduleBMapper.deleteBatchIds(moduleIds); + } + } + } + + /** + * 获取当前用户ID + */ + private String getCurrentUserId() { + try { + return SecurityUtils.getUserId(); + } catch (Exception e) { + return null; + } + } + + /** + * 根据父级编码查询子一级数据 + */ + private List getSubList(String parentId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (StrUtil.isNotBlank(parentId)) { + wrapper.eq(MsMaplayerB::getParentId, parentId); + } else { + wrapper.eq(MsMaplayerB::getTreeLevel, 1); + } + wrapper.orderByAsc(MsMaplayerB::getOrderIndex); + return msMaplayerBMapper.selectList(wrapper); + } + + /** + * 获取最大排序号 + */ + private Integer getMaxOrderIndex(List list) { + if (list.isEmpty()) { + return 0; + } + return list.stream() + .sorted(Comparator.comparing(MsMaplayerB::getOrderIndex, Comparator.nullsLast(Comparator.reverseOrder()))) + .collect(Collectors.toList()) + .get(0) + .getOrderIndex(); + } + + /** + * 判断同级下是否有编码一样的数据 + */ + private boolean hasSameCode(MsMaplayerB layer) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MsMaplayerB::getCode, layer.getCode()) + .eq(MsMaplayerB::getIsDeleted, 0); + List list = msMaplayerBMapper.selectList(wrapper); + if (list.isEmpty()) { + return false; + } + return !list.get(0).getId().equals(layer.getId()); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java new file mode 100644 index 00000000..5152e819 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapLayer/service/impl/MapLegendServiceImpl.java @@ -0,0 +1,97 @@ +package com.yfd.platform.qgc_sys.mapLayer.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMaplegendB; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMapmoduleB; +import com.yfd.platform.qgc_sys.mapLayer.mapper.MsMaplegendBMapper; +import com.yfd.platform.qgc_sys.mapLayer.mapper.MsMapmoduleBMapper; +import com.yfd.platform.qgc_sys.mapLayer.service.IMapLegendService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 地图图例基础服务实现 + * + * @author migration + */ +@Service +public class MapLegendServiceImpl extends ServiceImpl + implements IMapLegendService { + + @Resource + private MsMapmoduleBMapper msMapmoduleBMapper; + + @Override + public void delelteByIds(List ids) { + if (CollectionUtil.isEmpty(ids)) { + return; + } + for (String id : ids) { + // 根据id查询是否有数据或者子级数据 + MsMaplegendB legend = this.getById(id); + if (legend == null) { + continue; + } + + LambdaQueryWrapper childWrapper = new LambdaQueryWrapper<>(); + childWrapper.eq(MsMaplegendB::getParentId, id) + .eq(MsMaplegendB::getIsDeleted, 0); + List children = this.list(childWrapper); + if (!children.isEmpty()) { + throw new BizException("有子级图例,无法删除."); + } + + // 判断是否内置的数据 + if (legend.getInternal() != null && legend.getInternal() == 1) { + throw new BizException("无法删除系统内置的图例."); + } + + // 判断是否启用 + if (legend.getEnable() != null && legend.getEnable() == 1) { + throw new BizException("无法删除已启用的图例."); + } + + // 判断图例是否关联了菜单 + QueryWrapper moduleWrapper = new QueryWrapper<>(); + moduleWrapper.eq("IS_DELETED", 0); + moduleWrapper.eq("RES_TYPE", "legend"); + moduleWrapper.eq("RES_ID", id); + List moduleList = msMapmoduleBMapper.selectList(moduleWrapper); + if (!moduleList.isEmpty()) { + throw new BizException("无法删除:图例关联了菜单."); + } + + // 判断父级是否存在 + if (StrUtil.isBlank(legend.getParentId())) { + this.removeById(id); // 逻辑删除 + return; + } + + // 删除数据 + this.removeById(id); // 逻辑删除 + + if (StrUtil.isNotBlank(legend.getParentId())) { + // 判断父级下是否只有一个子级,如果只有一个子级并且是当前图例,则需要设置父级的hasChildren为0 + MsMaplegendB parent = this.getById(legend.getParentId()); + if (parent != null) { + LambdaQueryWrapper siblingWrapper = new LambdaQueryWrapper<>(); + siblingWrapper.eq(MsMaplegendB::getParentId, parent.getId()); + List siblings = this.list(siblingWrapper); + if (siblings.size() == 1 && id.equals(siblings.get(0).getId())) { + MsMaplegendB updateParent = new MsMaplegendB(); + updateParent.setId(parent.getId()); + updateParent.setHasChildren(0); + this.updateById(updateParent); + } + } + } + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/controller/MapmoduleBController.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/controller/MapmoduleBController.java new file mode 100644 index 00000000..09204d83 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/controller/MapmoduleBController.java @@ -0,0 +1,101 @@ +package com.yfd.platform.qgc_sys.mapcfg.controller; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yfd.platform.common.DataSourceRequest; +import com.yfd.platform.common.DataSourceResult; +import com.yfd.platform.config.ResponseResult; +import com.yfd.platform.common.exception.BizException; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMapmoduleB; +import com.yfd.platform.qgc_sys.mapcfg.service.IMapmoduleBService; +import com.yfd.platform.utils.DataSourceRequestUtil; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * 地图菜单配置控制层 + * + * @author migration + */ +@RestController +@RequestMapping("/mapmodule") +@Tag(name = "地图菜单配置") +public class MapmoduleBController { + + @Resource + private IMapmoduleBService mapmoduleBService; + + /** + * 条件过滤数据列表(Kendo UI 数据源) + */ + @Operation(summary = "条件过滤数据列表") + @PostMapping("/GetKendoList") + public ResponseResult getKendoList(@RequestBody DataSourceRequest dataSourceRequest) { + // 构建查询条件 + QueryWrapper wrapper = DataSourceRequestUtil.buildQueryWrapper( + dataSourceRequest, MsMapmoduleB.class); + + // 执行分页查询 + Page page = DataSourceRequestUtil.getPage(dataSourceRequest); + Page resultPage; + if (page != null) { + resultPage = mapmoduleBService.page(page, wrapper); + } else { + List list = mapmoduleBService.list(wrapper); + resultPage = new Page<>(); + resultPage.setRecords(list); + resultPage.setTotal(list.size()); + } + + // 构建 Kendo 数据源结果 + DataSourceResult dataSourceResult = new DataSourceResult<>(); + List dataList = resultPage.getRecords(); + dataSourceResult.setData(dataList); + dataSourceResult.setTotal(resultPage.getTotal()); + + // 翻译字典值(菜单名称) + if (dataList != null && !dataList.isEmpty()) { + mapmoduleBService.translateDict(dataList); + } + + return ResponseResult.successData(dataSourceResult); + } + + /** + * 地图图例关联系统及菜单 + */ + @Operation(summary = "地图图例关联系统及菜单") + @PostMapping("/save") + public ResponseResult saveOrUpdate(@RequestBody MsMapmoduleB mapmoduleB) { + if (mapmoduleB == null) { + throw new BizException("对象不能为空."); + } + if (StrUtil.isBlank(mapmoduleB.getModuleId())) { + throw new BizException("关联菜单(moduleId)不能为空."); + } + if (StrUtil.isBlank(mapmoduleB.getSystemId())) { + throw new BizException("关联系统(systemId)不能为空."); + } + if (StrUtil.isBlank(mapmoduleB.getResType())) { + throw new BizException("资源类型(resType: layer=图层,legend=图例,mapbox=地图)不能为空"); + } + if (StrUtil.isBlank(mapmoduleB.getResId())) { + throw new BizException("资源(resId)不能为空."); + } + return ResponseResult.successData(mapmoduleBService.saveOrUpdate(mapmoduleB)); + } + + /** + * 图例与系统菜单关联关系删除 + */ + @Operation(summary = "图例与系统菜单关联关系删除") + @PostMapping("/delete") + public ResponseResult deleteData(@RequestBody List ids) { + mapmoduleBService.delelteByIds(ids); + return ResponseResult.success("删除成功."); + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/service/IMapmoduleBService.java b/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/service/IMapmoduleBService.java new file mode 100644 index 00000000..26c34a34 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/service/IMapmoduleBService.java @@ -0,0 +1,36 @@ +package com.yfd.platform.qgc_sys.mapcfg.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMapmoduleB; + +import java.util.List; + +/** + * 地图菜单配置服务接口 + * + * @author migration + */ +public interface IMapmoduleBService extends IService { + + /** + * 新增或修改 + * + * @param entity 实体 + * @return 是否成功 + */ + boolean saveOrUpdate(MsMapmoduleB entity); + + /** + * 翻译字典值(菜单名称) + * + * @param list 数据列表 + */ + void translateDict(List list); + + /** + * 根据ID列表删除关联关系 + * + * @param ids ID列表 + */ + void delelteByIds(List ids); +} \ No newline at end of file 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 new file mode 100644 index 00000000..d650bb50 --- /dev/null +++ b/backend/src/main/java/com/yfd/platform/qgc_sys/mapcfg/service/impl/MapmoduleBServiceImpl.java @@ -0,0 +1,92 @@ +package com.yfd.platform.qgc_sys.mapcfg.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yfd.platform.qgc_sys.mapLayer.domain.MsMapmoduleB; +import com.yfd.platform.qgc_sys.mapLayer.mapper.MsMapmoduleBMapper; +import com.yfd.platform.qgc_sys.mapcfg.service.IMapmoduleBService; +import com.yfd.platform.system.domain.SysMenu; +import com.yfd.platform.system.mapper.SysMenuMapper; +import com.yfd.platform.utils.SecurityUtils; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 地图菜单配置服务实现类 + * + * @author migration + */ +@Service +public class MapmoduleBServiceImpl extends ServiceImpl + implements IMapmoduleBService { + + @Resource + private SysMenuMapper sysMenuMapper; + + + @Override + public boolean saveOrUpdate(MsMapmoduleB entity) { + if (StrUtil.isBlank(entity.getId())) { + // 新增 + entity.setRecordUser(SecurityUtils.getUserId()); + this.baseMapper.insert(entity); + } else { + // 修改 + this.baseMapper.updateById(entity); + } + return true; + } + + @Override + public void delelteByIds(List ids) { + if (ids != null) { + for (String id : ids) { + this.baseMapper.deleteById(id); + } + } + } + + @Override + public void translateDict(List list) { + if (list == null || list.isEmpty()) { + return; + } + // 收集所有 moduleId + List moduleIds = list.stream() + .filter(it -> StrUtil.isNotBlank(it.getModuleId())) + .map(MsMapmoduleB::getModuleId) + .distinct() + .collect(Collectors.toList()); + + if (moduleIds.isEmpty()) { + return; + } + + // 查询本地菜单表获取名称 + LambdaQueryWrapper menuWrapper = new LambdaQueryWrapper<>(); + menuWrapper.in(SysMenu::getId, moduleIds); + List menus = sysMenuMapper.selectList(menuWrapper); + + Map menuMap = new HashMap<>(); + menuMap.put("common", "通用菜单"); + for (SysMenu menu : menus) { + menuMap.put(menu.getId(), menu.getName()); + } + + // 设置菜单名称 + for (MsMapmoduleB item : list) { + if (StrUtil.isNotBlank(item.getModuleId())) { + String name = menuMap.get(item.getModuleId()); + if (name != null) { + item.setModuleName(name); + } + } + } + } +} \ No newline at end of file