瀏覽代碼

fix: 地图数据管理功能优化,新增树接口、地图数据接口,父子关联从父编码修改为父id

地图数据管理功能优化,新增树接口、地图数据接口,父子关联从父编码修改为父id
hong.yang 1 年之前
父節點
當前提交
ae66a907c7

+ 29 - 8
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/controller/DataRoomMapController.java

@@ -3,6 +3,7 @@ package com.gccloud.dataroom.core.module.map.controller;
 import com.gccloud.common.utils.BeanConvertUtils;
 import com.gccloud.common.vo.R;
 import com.gccloud.dataroom.core.module.map.dto.DataRoomMapRepeatDTO;
+import com.gccloud.dataroom.core.module.map.vo.DataRoomMapDataVO;
 import com.gccloud.dataroom.core.module.map.vo.DataRoomMapVO;
 import com.gccloud.dataroom.core.module.map.vo.MapChildVO;
 import com.gccloud.dataroom.core.module.map.dto.DataRoomMapDTO;
@@ -72,10 +73,10 @@ public class DataRoomMapController {
         return R.success();
     }
 
-    @GetMapping("/getMapChildFromGeoJson/{code}")
-    @ApiOperation(value = "根据父编码解析父级json中的子级", position = 60, notes = "根据父编码解析父级json中的子级", produces = MediaType.APPLICATION_JSON_VALUE)
-    public R<List<MapChildVO>> getMapChildFromGeoJson(@PathVariable String code) {
-        List<MapChildVO> list = dataRoomMapService.getChildFromGeo(code);
+    @GetMapping("/getMapChildFromGeoJson/{id}")
+    @ApiOperation(value = "根据地图id解析json中的子级", position = 60, notes = "根据地图id解析json中的子级", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<List<MapChildVO>> getMapChildFromGeoJson(@PathVariable String id) {
+        List<MapChildVO> list = dataRoomMapService.getChildFromGeo(id);
         return R.success(list);
     }
 
@@ -89,11 +90,23 @@ public class DataRoomMapController {
     }
 
 
-    @GetMapping("/data/{id}")
+    @GetMapping("/data/{parentId}/{code}")
     @ApiOperation(value = "数据", position = 80, notes = "地图数据数据", produces = MediaType.APPLICATION_JSON_VALUE)
-    public R<String> data(@PathVariable String id) {
-        DataRoomMapEntity info = dataRoomMapService.info(id);
-        return R.success(info.getGeoJson());
+    public R<DataRoomMapDataVO> data(@PathVariable String parentId, @PathVariable String code) {
+        DataRoomMapEntity info = dataRoomMapService.getByParentIdAndCode(parentId, code);
+        DataRoomMapDataVO vo = new DataRoomMapDataVO();
+        // 如果没有找到该地图,或地图没有上传geojson数据,
+        if (info == null) {
+            vo.setAvailable(0);
+            return R.success(vo);
+        }
+        vo.setAvailable(0);
+        if (info.getUploadedGeoJson().equals(1)) {
+            vo.setAvailable(1);
+        }
+        vo.setGeoJson(info.getGeoJson());
+        vo.setId(info.getId());
+        return R.success(vo);
     }
 
 
@@ -113,5 +126,13 @@ public class DataRoomMapController {
     }
 
 
+    @GetMapping("/tree/{level}")
+    @ApiOperation(value = "树", position = 110, notes = "地图数据树", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<List<DataRoomMapVO>> tree(@PathVariable Integer level) {
+        List<DataRoomMapVO> list = dataRoomMapService.getAvailableTree(level);
+        return R.success(list);
+    }
+
+
 
 }

+ 8 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/dao/DataRoomMapDao.java

@@ -23,4 +23,12 @@ public interface DataRoomMapDao extends BaseMapper<DataRoomMapEntity> {
      */
     List<DataRoomMapVO> getList(@Param("searchDTO") MapSearchDTO searchDTO);
 
+    /**
+     * 根据层级获取地图列表
+     * 列表包括所有目标层级的地图,以及目标层级的父地图...
+     * @param level
+     * @return
+     */
+    List<DataRoomMapEntity> getMapByLevel(@Param("level") Integer level);
+
 }

+ 1 - 1
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/dto/DataRoomMapDTO.java

@@ -15,7 +15,7 @@ public class DataRoomMapDTO {
     private String id;
 
     @ApiModelProperty(notes = "父级编码")
-    private String parentCode;
+    private String parentId;
 
     @ApiModelProperty(notes = "地图编码")
     private String mapCode;

+ 2 - 2
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/dto/DataRoomMapRepeatDTO.java

@@ -14,8 +14,8 @@ public class DataRoomMapRepeatDTO {
     @ApiModelProperty(notes = "主键")
     private String id;
 
-    @ApiModelProperty(notes = "父级编码")
-    private String parentCode;
+    @ApiModelProperty(notes = "父级地图id")
+    private String parentId;
 
     @ApiModelProperty(notes = "地图编码")
     private String mapCode;

+ 2 - 2
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/dto/MapSearchDTO.java

@@ -12,8 +12,8 @@ import lombok.Data;
 @Data
 public class MapSearchDTO extends SearchDTO {
 
-    @ApiModelProperty(notes = "父级编码")
-    private String parentCode;
+    @ApiModelProperty(notes = "父级地图id")
+    private String parentId;
 
     @ApiModelProperty(notes = "层级")
     private Integer level;

+ 2 - 2
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/entity/DataRoomMapEntity.java

@@ -21,8 +21,8 @@ import lombok.experimental.Accessors;
 @ToString(callSuper = true)
 public class DataRoomMapEntity extends SuperEntity {
 
-    @ApiModelProperty(notes = "父级编码")
-    private String parentCode;
+    @ApiModelProperty(notes = "父级地图id")
+    private String parentId;
 
     @ApiModelProperty(notes = "地图编码")
     private String mapCode;

+ 17 - 2
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/service/IDataRoomMapService.java

@@ -18,9 +18,9 @@ import java.util.List;
 public interface IDataRoomMapService extends ISuperService<DataRoomMapEntity> {
 
     /**
-     * 顶级父级编码
+     * 顶级父级id
      */
-    String SUPER_PARENT_CODE = "0";
+    String SUPER_PARENT_ID = "0";
 
 
     /**
@@ -31,6 +31,13 @@ public interface IDataRoomMapService extends ISuperService<DataRoomMapEntity> {
     List<DataRoomMapVO> getList(MapSearchDTO searchDTO);
 
 
+    /**
+     * 获取可用的地图树
+     * @param level
+     * @return
+     */
+    List<DataRoomMapVO> getAvailableTree(Integer level);
+
     /**
      * 添加地图
      * @param mapDTO
@@ -66,6 +73,14 @@ public interface IDataRoomMapService extends ISuperService<DataRoomMapEntity> {
      */
     DataRoomMapEntity info(String id);
 
+    /**
+     * 根据父级id和编码获取地图
+     * @param parentId
+     * @param code
+     * @return
+     */
+    DataRoomMapEntity getByParentIdAndCode(String parentId, String code);
+
 
     /**
      * 获取地图

+ 121 - 17
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/service/impl/DataRoomMapServiceImpl.java

@@ -20,7 +20,9 @@ import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.stereotype.Service;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -36,14 +38,96 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
 
     @Override
     public List<DataRoomMapVO> getList(MapSearchDTO searchDTO) {
-        List<DataRoomMapVO> list = this.baseMapper.getList(searchDTO);
-        return list;
+        return this.baseMapper.getList(searchDTO);
     }
 
+    @Override
+    public List<DataRoomMapVO> getAvailableTree(Integer level) {
+        // 根据层级,如果某个地图的某个子级(或子级的子级...)也符合该层级,那么把该地图也返回
+        LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(DataRoomMapEntity::getId, DataRoomMapEntity::getLevel, DataRoomMapEntity::getParentId, DataRoomMapEntity::getMapCode);
+        queryWrapper.le(DataRoomMapEntity::getLevel, level);
+        List<DataRoomMapEntity> list = list(queryWrapper);
+        // 转成树形结构
+        return this.convertToTree(list, level);
+    }
+
+
+    /**
+     * 转树形结构
+     * @param list
+     * @return
+     */
+    private List<DataRoomMapVO> convertToTree(List<DataRoomMapEntity> list, Integer targetLevel) {
+        List<DataRoomMapVO> voList = BeanConvertUtils.convert(list, DataRoomMapVO.class);
+        // 根节点
+        List<DataRoomMapVO> rootList = Lists.newArrayList();
+        // 组装id为key,地图为value的map
+        Map<String, DataRoomMapVO> map = new HashMap<>();
+        voList.forEach(vo -> map.put(vo.getId(), vo));
+        // 目标层级的地图
+        List<DataRoomMapVO> targetLevelList = voList.stream().filter(vo -> vo.getLevel().equals(targetLevel)).collect(Collectors.toList());
+        // 目标层级的地图,以及其父级地图...
+        List<DataRoomMapVO> match = Lists.newArrayList(targetLevelList);
+        for (DataRoomMapVO mapVO : targetLevelList) {
+            if (mapVO.getLevel().equals(0)) {
+                // 已经是最顶级了,没有父级了
+                continue;
+            }
+            DataRoomMapVO parent = map.get(mapVO.getParentId());
+            if(parent == null) {
+                continue;
+            }
+            // 将目标层级的地图,以及其父级地图...加入到match中
+            this.getParentMap(parent, map, match);
+        }
+        for (DataRoomMapVO vo : match) {
+            if (vo.getParentId().equals(SUPER_PARENT_ID)) {
+                rootList.add(vo);
+                continue;
+            }
+            DataRoomMapVO parent = map.get(vo.getParentId());
+            if (parent == null) {
+                continue;
+            }
+            if (parent.getChildren() == null) {
+                parent.setChildren(Lists.newArrayList());
+            }
+            parent.getChildren().add(vo);
+        }
+        return rootList;
+    }
+
+    /**
+     * 获取地图的父级地图,以及父级地图的父级地图...
+     * @param parentMap
+     * @param mapIdMap
+     * @param match
+     */
+    private void getParentMap(DataRoomMapVO parentMap, Map<String, DataRoomMapVO> mapIdMap, List<DataRoomMapVO> match) {
+        if (parentMap == null) {
+            return;
+        }
+        if (match.contains(parentMap)) {
+            // 已经包含了,不需要再加入了
+            return;
+        }
+        match.add(parentMap);
+        if (parentMap.getLevel().equals(0)) {
+            // 已经是最顶级了,没有父级了
+            return;
+        }
+        DataRoomMapVO parent = mapIdMap.get(parentMap.getParentId());
+        this.getParentMap(parent, mapIdMap, match);
+    }
+
+
+
+
     @Override
     public String add(DataRoomMapDTO mapDTO) {
-        if (StringUtils.isBlank(mapDTO.getParentCode())) {
-            mapDTO.setParentCode(SUPER_PARENT_CODE);
+        if (StringUtils.isBlank(mapDTO.getParentId())) {
+            mapDTO.setParentId(SUPER_PARENT_ID);
         }
         if (StringUtils.isBlank(mapDTO.getMapCode())) {
             throw new GlobalException("地图编码不能为空");
@@ -91,10 +175,10 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
 
     /**
      * 从geoJson中解析下一级的基础数据,保存到数据库
-     * @param old
+     * @param mapEntity
      * @param geoJson
      */
-    private void parseNextLevelAndSave(DataRoomMapEntity old, String geoJson) {
+    private void parseNextLevelAndSave(DataRoomMapEntity mapEntity, String geoJson) {
         JSONObject jsonObject = new JSONObject(geoJson);
         JSONArray features = jsonObject.getJSONArray("features");
         if (features == null || features.length() == 0) {
@@ -108,8 +192,8 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
                 continue;
             }
             DataRoomMapEntity childMapEntity = new DataRoomMapEntity();
-            childMapEntity.setParentCode(old.getMapCode());
-            childMapEntity.setLevel(old.getLevel() + 1);
+            childMapEntity.setParentId(mapEntity.getId());
+            childMapEntity.setLevel(mapEntity.getLevel() + 1);
             childMapEntity.setMapCode(properties.getString("name"));
             childMapEntity.setName(properties.getString("name"));
             childMapEntity.setEnableDown(NO);
@@ -131,7 +215,7 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
             return;
         }
         LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(DataRoomMapEntity::getParentCode, mapEntity.getMapCode());
+        queryWrapper.eq(DataRoomMapEntity::getParentId, mapEntity.getId());
         List<DataRoomMapEntity> list = this.list(queryWrapper);
         if (list != null && list.size() > 0) {
             throw new GlobalException("该地图下存在子地图,不能删除");
@@ -154,7 +238,7 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
             return;
         }
         LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(DataRoomMapEntity::getParentCode, mapEntity.getMapCode());
+        queryWrapper.eq(DataRoomMapEntity::getParentId, mapEntity.getId());
         List<DataRoomMapEntity> list = this.list(queryWrapper);
         if (list != null && list.size() > 0) {
             for (DataRoomMapEntity entity : list) {
@@ -173,6 +257,27 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
         return mapEntity;
     }
 
+    @Override
+    public DataRoomMapEntity getByParentIdAndCode(String parentId, String code) {
+        if (StringUtils.isBlank(parentId)) {
+            parentId = SUPER_PARENT_ID;
+        }
+        if (StringUtils.isBlank(code)) {
+            throw new GlobalException("地图编码不能为空");
+        }
+        LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DataRoomMapEntity::getParentId, parentId);
+        queryWrapper.eq(DataRoomMapEntity::getMapCode, code);
+        List<DataRoomMapEntity> list = this.list(queryWrapper);
+        if (list == null || list.size() == 0) {
+            return null;
+        }
+        if (list.size() > 1) {
+            throw new GlobalException("地图编码重复");
+        }
+        return list.get(0);
+    }
+
     @Override
     public DataRoomMapEntity infoByMapCode(String mapCode) {
         LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
@@ -190,12 +295,12 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
 
     /**
      * 根据编码获取地图信息,取到geoJson,根据geoJson解析下一级的基础数据
-     * @param code
+     * @param id
      * @return
      */
     @Override
-    public List<MapChildVO> getChildFromGeo(String code) {
-        DataRoomMapEntity mapEntity = this.infoByMapCode(code);
+    public List<MapChildVO> getChildFromGeo(String id) {
+        DataRoomMapEntity mapEntity = this.getById(id);
         if (mapEntity.getUploadedGeoJson().equals(NO)) {
             return Lists.newArrayList();
         }
@@ -211,7 +316,7 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
         // 查询当前地图下的所有子地图
         LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.select(DataRoomMapEntity::getMapCode);
-        queryWrapper.eq(DataRoomMapEntity::getParentCode, code);
+        queryWrapper.eq(DataRoomMapEntity::getParentId, id);
         List<DataRoomMapEntity> list = this.list(queryWrapper);
         List<String> mapCodeList = list.stream().map(DataRoomMapEntity::getMapCode).collect(Collectors.toList());
         // 解析geoJson,获取下一级的基础数据
@@ -254,13 +359,12 @@ public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoom
         if (StringUtils.isBlank(mapDTO.getMapCode())) {
             throw new GlobalException("地图编码不能为空");
         }
-        if (StringUtils.isBlank(mapDTO.getParentCode())) {
+        if (StringUtils.isBlank(mapDTO.getParentId())) {
             throw new GlobalException("上级地图编码不能为空");
         }
-        // TODO 这里存在问题,因为编码只在某个地图下的某个层级下是唯一的,所以如果碰巧有两个地图下的某个层级下的编码相同,就会出现问题
         LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(DataRoomMapEntity::getMapCode, mapDTO.getMapCode());
-        queryWrapper.eq(DataRoomMapEntity::getParentCode, mapDTO.getParentCode());
+        queryWrapper.eq(DataRoomMapEntity::getParentId, mapDTO.getParentId());
         if (StringUtils.isNotBlank(mapDTO.getId())) {
             queryWrapper.ne(DataRoomMapEntity::getId, mapDTO.getId());
         }

+ 26 - 0
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/vo/DataRoomMapDataVO.java

@@ -0,0 +1,26 @@
+package com.gccloud.dataroom.core.module.map.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/9/4 17:16
+ */
+@Data
+public class DataRoomMapDataVO {
+
+    @ApiModelProperty(notes = "主键")
+    private String id;
+
+    @ApiModelProperty(notes = "是否支持下钻 0-否 1-是")
+    private Integer enableDown;
+
+    @ApiModelProperty(notes = "geo地图数据json")
+    private String geoJson;
+
+    @ApiModelProperty(notes = "是否可用")
+    private Integer available;
+
+}

+ 7 - 1
DataRoom/dataroom-core/src/main/java/com/gccloud/dataroom/core/module/map/vo/DataRoomMapVO.java

@@ -3,6 +3,8 @@ package com.gccloud.dataroom.core.module.map.vo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 /**
  * @author hongyang
  * @version 1.0
@@ -15,7 +17,7 @@ public class DataRoomMapVO {
     private String id;
 
     @ApiModelProperty(notes = "父级编码")
-    private String parentCode;
+    private String parentId;
 
     @ApiModelProperty(notes = "地图编码")
     private String mapCode;
@@ -37,4 +39,8 @@ public class DataRoomMapVO {
 
     @ApiModelProperty(notes = "是否有子节点")
     private Boolean hasChildren;
+
+    @ApiModelProperty(notes = "子级")
+    private List<DataRoomMapVO> children;
+
 }

+ 16 - 5
DataRoom/dataroom-core/src/main/resources/mapper/DataRoomMapDao.xml

@@ -6,7 +6,7 @@
     <!--  查询地图数据  -->
     <select id="getList" resultType="com.gccloud.dataroom.core.module.map.vo.DataRoomMapVO">
         SELECT id,
-               parent_code,
+               parent_id,
                map_code,
                name,
                level,
@@ -18,18 +18,18 @@
                create_by,
                update_by,
                del_flag,
-                map_code as curentMapcode,
+               id as curentMapId,
                CASE WHEN EXISTS(SELECT 1
                                 FROM big_screen_map
-                                WHERE parent_code = curentMapcode
+                                WHERE parent_id = curentMapId
                                   AND del_flag = 0)
                    THEN 1
                ELSE 0 END AS has_children
         FROM big_screen_map
         WHERE del_flag = 0
         <if test="searchDTO != null">
-            <if test="searchDTO.parentCode != null and searchDTO.parentCode != ''">
-                AND parent_code = #{searchDTO.parentCode}
+            <if test="searchDTO.parentId != null and searchDTO.parentId != ''">
+                AND parent_id = #{searchDTO.parentId}
             </if>
             <if test="searchDTO.searchKey != null and searchDTO.searchKey != ''">
                 AND (
@@ -51,5 +51,16 @@
 
     </select>
 
+    <select id="getMapByLevel" resultType="com.gccloud.dataroom.core.module.map.entity.DataRoomMapEntity">
+        select id, level, parent_id, map_code
+        from big_screen_map
+        where (level &lt; #{level}
+        and id in (select distinct parent_id from big_screen_map where del_flag != 0)
+        )
+        OR level = #{level}
+        and del_flag = 0
+    </select>
+
+
 
 </mapper>

+ 1 - 1
DataRoom/dataroom-server/src/main/resources/init-h2.sql

@@ -167,7 +167,7 @@ CREATE TABLE IF NOT EXISTS  ds_dataset_label (
 
 CREATE TABLE IF NOT EXISTS big_screen_map (
     id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
-    parent_code VARCHAR(255) DEFAULT NULL COMMENT '父级地图编码',
+    parent_id VARCHAR(255) DEFAULT NULL COMMENT '父级地图id',
     map_code VARCHAR(255) DEFAULT NULL COMMENT '地图编码',
     name VARCHAR(255) DEFAULT NULL COMMENT '地图名称',
     geo_json CLOB DEFAULT NULL COMMENT '地图geoJson',

+ 1 - 1
DataRoom/doc/init.sql

@@ -191,7 +191,7 @@ DROP TABLE IF EXISTS `big_screen_map`;
 CREATE TABLE `big_screen_map`
 (
     `id`                bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',
-    `parent_code`       varchar(255)        DEFAULT NULL COMMENT '父级地图编码',
+    `parent_id`       varchar(255)        DEFAULT NULL COMMENT '父级地图id',
     `map_code`          varchar(255)        DEFAULT NULL COMMENT '地图编码',
     `name`              varchar(255)        DEFAULT NULL COMMENT '地图名称',
     `geo_json`          longtext            DEFAULT NULL COMMENT '地图geoJson',

+ 1 - 1
DataRoom/doc/update.sql

@@ -111,7 +111,7 @@ DROP TABLE IF EXISTS `big_screen_map`;
 CREATE TABLE `big_screen_map`
 (
     `id`                bigint(32) NOT NULL AUTO_INCREMENT COMMENT '主键',
-    `parent_code`       varchar(255)        DEFAULT NULL COMMENT '父级地图编码',
+    `parent_id`       varchar(255)        DEFAULT NULL COMMENT '父级地图id',
     `map_code`          varchar(255)        DEFAULT NULL COMMENT '地图编码',
     `name`              varchar(255)        DEFAULT NULL COMMENT '地图名称',
     `geo_json`          longtext            DEFAULT NULL COMMENT '地图geoJson',