Przeglądaj źródła

feat: 地图数据管理功能开发

地图数据管理功能开发
hong.yang 1 rok temu
rodzic
commit
8b5561ed85

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

@@ -0,0 +1,117 @@
+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.DataRoomMapVO;
+import com.gccloud.dataroom.core.module.map.vo.MapChildVO;
+import com.gccloud.dataroom.core.module.map.dto.DataRoomMapDTO;
+import com.gccloud.dataroom.core.module.map.dto.MapSearchDTO;
+import com.gccloud.dataroom.core.module.map.entity.DataRoomMapEntity;
+import com.gccloud.dataroom.core.module.map.service.IDataRoomMapService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiSort;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 地图数据管理
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/8/31 16:52
+ */
+@Slf4j
+@RestController
+@RequestMapping("/bigScreen/map")
+@Api(tags = "地图数据管理")
+@ApiSort(value = 110)
+public class DataRoomMapController {
+
+    @Resource
+    private IDataRoomMapService dataRoomMapService;
+
+
+    @GetMapping("/list")
+    @ApiOperation(value = "列表", position = 10, notes = "地图数据列表查询", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<List<DataRoomMapVO>> list(MapSearchDTO searchDTO) {
+        List<DataRoomMapVO> list = dataRoomMapService.getList(searchDTO);
+        return R.success(list);
+    }
+
+
+    @PostMapping("/add")
+    @ApiOperation(value = "添加", position = 20, notes = "添加地图数据", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<String> add(@RequestBody DataRoomMapDTO mapDTO) {
+        String id = dataRoomMapService.add(mapDTO);
+        return R.success(id);
+    }
+
+    @PostMapping("/update")
+    @ApiOperation(value = "修改", position = 30, notes = "修改地图数据", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Void> update(@RequestBody DataRoomMapDTO mapDTO) {
+        dataRoomMapService.update(mapDTO);
+        return R.success();
+    }
+
+    @PostMapping("/delete/{id}")
+    @ApiOperation(value = "删除", position = 40, notes = "删除地图数据", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Void> delete(@PathVariable String id) {
+        dataRoomMapService.delete(id);
+        return R.success();
+    }
+
+    @PostMapping("/cascadingDelete/{id}")
+    @ApiOperation(value = "级联删除", position = 50, notes = "级联删除地图数据", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Void> cascadingDelete(@PathVariable String id) {
+        dataRoomMapService.cascadingDelete(id);
+        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);
+        return R.success(list);
+    }
+
+
+    @GetMapping("/info/{id}")
+    @ApiOperation(value = "详情", position = 70, notes = "地图数据详情", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<DataRoomMapVO> info(@PathVariable String id) {
+        DataRoomMapEntity info = dataRoomMapService.info(id);
+        DataRoomMapVO vo = BeanConvertUtils.convert(info, DataRoomMapVO.class);
+        return R.success(vo);
+    }
+
+
+    @GetMapping("/data/{id}")
+    @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());
+    }
+
+
+    @PostMapping("/upload")
+    @ApiOperation(value = "上传", position = 90, notes = "上传地图数据", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Void> upload(@RequestBody DataRoomMapDTO mapDTO) {
+        dataRoomMapService.uploadGeoJson(mapDTO.getId(), mapDTO.getGeoJson());
+        return R.success();
+    }
+
+
+    @PostMapping("/repeat")
+    @ApiOperation(value = "重复", position = 100, notes = "地图数据重复校验", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R<Boolean> repeat(@RequestBody DataRoomMapRepeatDTO mapDTO) {
+        Boolean repeat = dataRoomMapService.repeatCheck(mapDTO);
+        return R.success(repeat);
+    }
+
+
+
+}

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

@@ -0,0 +1,26 @@
+package com.gccloud.dataroom.core.module.map.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gccloud.dataroom.core.module.map.dto.MapSearchDTO;
+import com.gccloud.dataroom.core.module.map.entity.DataRoomMapEntity;
+import com.gccloud.dataroom.core.module.map.vo.DataRoomMapVO;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/8/31 13:52
+ */
+@Mapper
+public interface DataRoomMapDao extends BaseMapper<DataRoomMapEntity> {
+
+    /**
+     * 获取地图列表
+     * @return
+     */
+    List<DataRoomMapVO> getList(@Param("searchDTO") MapSearchDTO searchDTO);
+
+}

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

@@ -0,0 +1,38 @@
+package com.gccloud.dataroom.core.module.map.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/8/31 13:44
+ */
+@Data
+public class DataRoomMapDTO {
+
+    @ApiModelProperty(notes = "主键")
+    private String id;
+
+    @ApiModelProperty(notes = "父级编码")
+    private String parentCode;
+
+    @ApiModelProperty(notes = "地图编码")
+    private String mapCode;
+
+    @ApiModelProperty(notes = "地图名称")
+    private String name;
+
+    @ApiModelProperty(notes = "地图级别 0-世界 1-国家 2-省 3-市 4-区县")
+    private Integer level;
+
+    @ApiModelProperty(notes = "是否支持下钻")
+    private Integer enableDown;
+
+    @ApiModelProperty(notes = "geo地图数据json")
+    private String geoJson;
+
+    @ApiModelProperty(notes = "是否自动解析下一级,是的话根据geoJson自动解析下一级的基础信息(不包含geoJson)")
+    private Integer autoParseNextLevel;
+
+}

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

@@ -0,0 +1,23 @@
+package com.gccloud.dataroom.core.module.map.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/9/7 16:14
+ */
+@Data
+public class DataRoomMapRepeatDTO {
+
+    @ApiModelProperty(notes = "主键")
+    private String id;
+
+    @ApiModelProperty(notes = "父级编码")
+    private String parentCode;
+
+    @ApiModelProperty(notes = "地图编码")
+    private String mapCode;
+
+}

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

@@ -0,0 +1,27 @@
+package com.gccloud.dataroom.core.module.map.dto;
+
+import com.gccloud.common.dto.SearchDTO;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/8/31 14:07
+ */
+@Data
+public class MapSearchDTO extends SearchDTO {
+
+    @ApiModelProperty(notes = "父级编码")
+    private String parentCode;
+
+    @ApiModelProperty(notes = "层级")
+    private Integer level;
+
+    @ApiModelProperty(notes = "是否已上传")
+    private Integer uploadedGeoJson;
+
+    @ApiModelProperty(notes = "是否支持下钻")
+    private Integer enableDown;
+
+}

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

@@ -0,0 +1,46 @@
+package com.gccloud.dataroom.core.module.map.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.gccloud.common.entity.SuperEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * geo地图信息
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/8/31 13:36
+ */
+@Data
+@Accessors(chain = true)
+@TableName("big_screen_map")
+@ApiModel
+@ToString(callSuper = true)
+public class DataRoomMapEntity extends SuperEntity {
+
+    @ApiModelProperty(notes = "父级编码")
+    private String parentCode;
+
+    @ApiModelProperty(notes = "地图编码")
+    private String mapCode;
+
+    @ApiModelProperty(notes = "地图名称")
+    private String name;
+
+    @ApiModelProperty(notes = "地图级别 0-世界 1-国家 2-省 3-市 4-区县")
+    private Integer level;
+
+    @ApiModelProperty(notes = "是否支持下钻 0-否 1-是")
+    private Integer enableDown;
+
+    @ApiModelProperty(notes = "geo地图数据json")
+    private String geoJson;
+
+    @ApiModelProperty(notes = "是否已上传geoJson 0-否 1-是")
+    private Integer uploadedGeoJson;
+
+
+}

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

@@ -0,0 +1,100 @@
+package com.gccloud.dataroom.core.module.map.service;
+
+import com.gccloud.common.service.ISuperService;
+import com.gccloud.dataroom.core.module.map.dto.DataRoomMapRepeatDTO;
+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;
+import com.gccloud.dataroom.core.module.map.dto.MapSearchDTO;
+import com.gccloud.dataroom.core.module.map.entity.DataRoomMapEntity;
+
+import java.util.List;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/8/31 13:53
+ */
+public interface IDataRoomMapService extends ISuperService<DataRoomMapEntity> {
+
+    /**
+     * 顶级父级编码
+     */
+    String SUPER_PARENT_CODE = "0";
+
+
+    /**
+     * 获取地图列表
+     * @param searchDTO
+     * @return
+     */
+    List<DataRoomMapVO> getList(MapSearchDTO searchDTO);
+
+
+    /**
+     * 添加地图
+     * @param mapDTO
+     * @return
+     */
+    String add(DataRoomMapDTO mapDTO);
+
+
+    /**
+     * 修改地图
+     * @param mapDTO
+     */
+    void update(DataRoomMapDTO mapDTO);
+
+
+    /**
+     * 删除地图
+     * @param id
+     */
+    void delete(String id);
+
+    /**
+     * 级联删除地图,删除地图及其子地图...
+     * @param id
+     */
+    void cascadingDelete(String id);
+
+
+    /**
+     * 获取地图
+     * @param id
+     * @return
+     */
+    DataRoomMapEntity info(String id);
+
+
+    /**
+     * 获取地图
+     * @param mapCode
+     * @return
+     */
+    DataRoomMapEntity infoByMapCode(String mapCode);
+
+
+    /**
+     * 根据编码获取地图信息,取到geoJson,根据geoJson解析下一级的基础数据
+     * @param code
+     * @return
+     */
+    List<MapChildVO> getChildFromGeo(String code);
+
+
+    /**
+     * 上传geoJson
+     * @param id
+     * @param geoJson
+     */
+    void uploadGeoJson(String id, String geoJson);
+
+    /**
+     * 编码重复校验
+     * @param mapDTO
+     * @return
+     */
+    boolean repeatCheck(DataRoomMapRepeatDTO mapDTO);
+
+}

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

@@ -0,0 +1,270 @@
+package com.gccloud.dataroom.core.module.map.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gccloud.common.exception.GlobalException;
+import com.gccloud.common.utils.BeanConvertUtils;
+import com.gccloud.common.utils.JSON;
+import com.gccloud.dataroom.core.module.map.dto.DataRoomMapRepeatDTO;
+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.dao.DataRoomMapDao;
+import com.gccloud.dataroom.core.module.map.dto.DataRoomMapDTO;
+import com.gccloud.dataroom.core.module.map.dto.MapSearchDTO;
+import com.gccloud.dataroom.core.module.map.entity.DataRoomMapEntity;
+import com.gccloud.dataroom.core.module.map.service.IDataRoomMapService;
+import com.google.common.collect.Lists;
+import org.apache.commons.lang3.StringUtils;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/8/31 14:08
+ */
+@Service
+public class DataRoomMapServiceImpl extends ServiceImpl<DataRoomMapDao, DataRoomMapEntity> implements IDataRoomMapService {
+
+    public static final int YES = 1;
+    public static final int NO = 0;
+
+    @Override
+    public List<DataRoomMapVO> getList(MapSearchDTO searchDTO) {
+        List<DataRoomMapVO> list = this.baseMapper.getList(searchDTO);
+        return list;
+    }
+
+    @Override
+    public String add(DataRoomMapDTO mapDTO) {
+        if (StringUtils.isBlank(mapDTO.getParentCode())) {
+            mapDTO.setParentCode(SUPER_PARENT_CODE);
+        }
+        if (StringUtils.isBlank(mapDTO.getMapCode())) {
+            throw new GlobalException("地图编码不能为空");
+        }
+        DataRoomMapEntity mapEntity = BeanConvertUtils.convert(mapDTO, DataRoomMapEntity.class);
+        if (StringUtils.isNotBlank(mapEntity.getGeoJson())) {
+            mapEntity.setUploadedGeoJson(YES);
+        } else {
+            mapEntity.setUploadedGeoJson(NO);
+        }
+        this.save(mapEntity);
+        if (mapDTO.getAutoParseNextLevel().equals(YES) && mapEntity.getUploadedGeoJson().equals(YES)) {
+            // 自动从geoJson中解析下一级的基础数据,保存到数据库,将geoJson上传状态置为false
+            this.parseNextLevelAndSave(mapEntity, mapEntity.getGeoJson());
+        }
+        return mapEntity.getId();
+    }
+
+    @Override
+    public void update(DataRoomMapDTO mapDTO) {
+        if (StringUtils.isBlank(mapDTO.getId())) {
+            throw new GlobalException("地图id不能为空");
+        }
+        DataRoomMapEntity old = this.getById(mapDTO.getId());
+        if (old == null) {
+            throw new GlobalException("地图不存在");
+        }
+        Integer uploadedGeoJson = old.getUploadedGeoJson();
+        LambdaUpdateWrapper<DataRoomMapEntity> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.eq(DataRoomMapEntity::getId, mapDTO.getId());
+        // 只允许修改名称和是否开启下钻
+        updateWrapper.set(DataRoomMapEntity::getName, mapDTO.getName());
+        updateWrapper.set(DataRoomMapEntity::getEnableDown, mapDTO.getEnableDown());
+        // 如果之前没有上传过geoJson,现在上传了,那么允许更新geoJson
+        if (!uploadedGeoJson.equals(YES) && StringUtils.isNotBlank(mapDTO.getGeoJson())) {
+            if (mapDTO.getAutoParseNextLevel().equals(YES)) {
+                // 自动从geoJson中解析下一级的基础数据,保存到数据库
+                this.parseNextLevelAndSave(old, mapDTO.getGeoJson());
+            }
+            updateWrapper.set(DataRoomMapEntity::getGeoJson, mapDTO.getGeoJson());
+            updateWrapper.set(DataRoomMapEntity::getUploadedGeoJson, YES);
+        }
+        this.update(updateWrapper);
+    }
+
+    /**
+     * 从geoJson中解析下一级的基础数据,保存到数据库
+     * @param old
+     * @param geoJson
+     */
+    private void parseNextLevelAndSave(DataRoomMapEntity old, String geoJson) {
+        JSONObject jsonObject = new JSONObject(geoJson);
+        JSONArray features = jsonObject.getJSONArray("features");
+        if (features == null || features.length() == 0) {
+            throw new GlobalException("GeoJson格式不正确,自动解析失败");
+        }
+        List<DataRoomMapEntity> mapEntityList = Lists.newArrayList();
+        for (int i = 0; i < features.length(); i++) {
+            JSONObject feature = features.getJSONObject(i);
+            JSONObject properties = feature.getJSONObject("properties");
+            if (properties == null) {
+                continue;
+            }
+            DataRoomMapEntity childMapEntity = new DataRoomMapEntity();
+            childMapEntity.setParentCode(old.getMapCode());
+            childMapEntity.setLevel(old.getLevel() + 1);
+            childMapEntity.setMapCode(properties.getString("name"));
+            childMapEntity.setName(properties.getString("name"));
+            childMapEntity.setEnableDown(NO);
+            childMapEntity.setUploadedGeoJson(NO);
+            mapEntityList.add(childMapEntity);
+        }
+        if (mapEntityList.size() > 0) {
+            this.saveBatch(mapEntityList);
+        }
+    }
+
+    @Override
+    public void delete(String id) {
+        if (StringUtils.isBlank(id)) {
+            return;
+        }
+        DataRoomMapEntity mapEntity = this.getById(id);
+        if (mapEntity == null) {
+            return;
+        }
+        LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DataRoomMapEntity::getParentCode, mapEntity.getMapCode());
+        List<DataRoomMapEntity> list = this.list(queryWrapper);
+        if (list != null && list.size() > 0) {
+            throw new GlobalException("该地图下存在子地图,不能删除");
+        }
+        this.removeById(id);
+    }
+
+
+    /**
+     * 级联删除
+     * @param id
+     */
+    @Override
+    public void cascadingDelete(String id) {
+        if (StringUtils.isBlank(id)) {
+            return;
+        }
+        DataRoomMapEntity mapEntity = this.getById(id);
+        if (mapEntity == null) {
+            return;
+        }
+        LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DataRoomMapEntity::getParentCode, mapEntity.getMapCode());
+        List<DataRoomMapEntity> list = this.list(queryWrapper);
+        if (list != null && list.size() > 0) {
+            for (DataRoomMapEntity entity : list) {
+                this.cascadingDelete(entity.getId());
+            }
+        }
+        this.removeById(id);
+    }
+
+    @Override
+    public DataRoomMapEntity info(String id) {
+        DataRoomMapEntity mapEntity = getById(id);
+        if (mapEntity == null) {
+            throw new GlobalException("地图不存在");
+        }
+        return mapEntity;
+    }
+
+    @Override
+    public DataRoomMapEntity infoByMapCode(String mapCode) {
+        LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DataRoomMapEntity::getMapCode, mapCode);
+        List<DataRoomMapEntity> list = this.list(queryWrapper);
+        if (list == null || list.size() == 0) {
+            throw new GlobalException("地图不存在");
+        }
+        if (list.size() > 1) {
+            throw new GlobalException("地图编码重复");
+        }
+        return list.get(0);
+    }
+
+
+    /**
+     * 根据编码获取地图信息,取到geoJson,根据geoJson解析下一级的基础数据
+     * @param code
+     * @return
+     */
+    @Override
+    public List<MapChildVO> getChildFromGeo(String code) {
+        DataRoomMapEntity mapEntity = this.infoByMapCode(code);
+        if (mapEntity.getUploadedGeoJson().equals(NO)) {
+            return Lists.newArrayList();
+        }
+        String geoJson = mapEntity.getGeoJson();
+        if (StringUtils.isBlank(geoJson)) {
+            return Lists.newArrayList();
+        }
+        JSONObject geoObj = JSON.parseObject(geoJson);
+        JSONArray features = geoObj.getJSONArray("features");
+        if (features == null || features.length() == 0) {
+            return Lists.newArrayList();
+        }
+        // 查询当前地图下的所有子地图
+        LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.select(DataRoomMapEntity::getMapCode);
+        queryWrapper.eq(DataRoomMapEntity::getParentCode, code);
+        List<DataRoomMapEntity> list = this.list(queryWrapper);
+        List<String> mapCodeList = list.stream().map(DataRoomMapEntity::getMapCode).collect(Collectors.toList());
+        // 解析geoJson,获取下一级的基础数据
+        List<MapChildVO> childList = Lists.newArrayList();
+        for (int i = 0; i < features.length(); i++) {
+            JSONObject feature = features.getJSONObject(i);
+            JSONObject properties = feature.getJSONObject("properties");
+            String name = properties.getString("name");
+            MapChildVO childVO = new MapChildVO();
+            childVO.setName(name);
+            childVO.setExist(mapCodeList.contains(name));
+            childList.add(childVO);
+        }
+        return childList;
+    }
+
+
+    @Override
+    public void uploadGeoJson(String id, String geoJson) {
+        if (StringUtils.isBlank(id)) {
+            throw new GlobalException("地图id不能为空");
+        }
+        if (StringUtils.isBlank(geoJson)) {
+            throw new GlobalException("geoJson不能为空");
+        }
+        DataRoomMapEntity mapEntity = this.getById(id);
+        if (mapEntity == null) {
+            throw new GlobalException("地图不存在");
+        }
+        if (mapEntity.getUploadedGeoJson().equals(YES)) {
+            throw new GlobalException("该地图已上传过geoJson,不能重复上传");
+        }
+        mapEntity.setGeoJson(geoJson);
+        mapEntity.setUploadedGeoJson(YES);
+        this.updateById(mapEntity);
+    }
+
+    @Override
+    public boolean repeatCheck(DataRoomMapRepeatDTO mapDTO) {
+        if (StringUtils.isBlank(mapDTO.getMapCode())) {
+            throw new GlobalException("地图编码不能为空");
+        }
+        if (StringUtils.isBlank(mapDTO.getParentCode())) {
+            throw new GlobalException("上级地图编码不能为空");
+        }
+        // TODO 这里存在问题,因为编码只在某个地图下的某个层级下是唯一的,所以如果碰巧有两个地图下的某个层级下的编码相同,就会出现问题
+        LambdaQueryWrapper<DataRoomMapEntity> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(DataRoomMapEntity::getMapCode, mapDTO.getMapCode());
+        queryWrapper.eq(DataRoomMapEntity::getParentCode, mapDTO.getParentCode());
+        if (StringUtils.isNotBlank(mapDTO.getId())) {
+            queryWrapper.ne(DataRoomMapEntity::getId, mapDTO.getId());
+        }
+        List<DataRoomMapEntity> list = this.list(queryWrapper);
+        return list != null && list.size() > 0;
+    }
+}

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

@@ -0,0 +1,40 @@
+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 DataRoomMapVO {
+
+    @ApiModelProperty(notes = "主键")
+    private String id;
+
+    @ApiModelProperty(notes = "父级编码")
+    private String parentCode;
+
+    @ApiModelProperty(notes = "地图编码")
+    private String mapCode;
+
+    @ApiModelProperty(notes = "地图名称")
+    private String name;
+
+    @ApiModelProperty(notes = "地图级别 0-世界 1-国家 2-省 3-市 4-区县")
+    private Integer level;
+
+    @ApiModelProperty(notes = "是否支持下钻 0-否 1-是")
+    private Integer enableDown;
+
+    @ApiModelProperty(notes = "geo地图数据json")
+    private String geoJson;
+
+    @ApiModelProperty(notes = "是否已上传geoJson 0-否 1-是")
+    private Integer uploadedGeoJson;
+
+    @ApiModelProperty(notes = "是否有子节点")
+    private Boolean hasChildren;
+}

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

@@ -0,0 +1,20 @@
+package com.gccloud.dataroom.core.module.map.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author hongyang
+ * @version 1.0
+ * @date 2023/8/31 16:13
+ */
+@Data
+public class MapChildVO {
+
+    @ApiModelProperty(notes = "地图名称")
+    private String name;
+
+    @ApiModelProperty(notes = "是否已存在")
+    private Boolean exist;
+
+}

+ 55 - 0
DataRoom/dataroom-core/src/main/resources/mapper/DataRoomMapDao.xml

@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.gccloud.dataroom.core.module.map.dao.DataRoomMapDao">
+
+    <!--  查询地图数据  -->
+    <select id="getList" resultType="com.gccloud.dataroom.core.module.map.vo.DataRoomMapVO">
+        SELECT id,
+               parent_code,
+               map_code,
+               name,
+               level,
+               enable_down,
+               geo_json,
+               uploaded_geo_json,
+               create_date,
+               update_date,
+               create_by,
+               update_by,
+               del_flag,
+                map_code as curentMapcode,
+               CASE WHEN EXISTS(SELECT 1
+                                FROM big_screen_map
+                                WHERE parent_code = curentMapcode
+                                  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>
+            <if test="searchDTO.searchKey != null and searchDTO.searchKey != ''">
+                AND (
+                    name like concat('%', #{searchDTO.searchKey}, '%')
+                    OR map_code like concat('%', #{searchDTO.searchKey}, '%')
+                    )
+            </if>
+            <if test="searchDTO.enableDown != null">
+                AND enable_down = #{searchDTO.enableDown}
+            </if>
+            <if test="searchDTO.level != null">
+                AND level = #{searchDTO.level}
+            </if>
+            <if test="searchDTO.uploadedGeoJson != null">
+                AND uploaded_geo_json = #{searchDTO.uploadedGeoJson}
+            </if>
+
+        </if>
+
+    </select>
+
+
+</mapper>

+ 23 - 1
DataRoom/doc/update.sql

@@ -103,4 +103,26 @@ CREATE TABLE `ds_dataset_label` (
 ) ENGINE=InnoDB   DEFAULT CHARSET=utf8 COLLATE=utf8_general_mysql500_ci COMMENT='数据集与标签关联表';
 
 # 20230710 数据源新增字段
-ALTER TABLE `ds_datasource` ADD COLUMN `table_name` varchar(255) DEFAULT NULL COMMENT '表名' AFTER `module_code`;
+ALTER TABLE `ds_datasource` ADD COLUMN `table_name` varchar(255) DEFAULT NULL COMMENT '表名' AFTER `module_code`;
+
+
+# 20230907 新增地图数据维护表
+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 '父级地图编码',
+    `map_code`          varchar(255)        DEFAULT NULL COMMENT '地图编码',
+    `name`              varchar(255)        DEFAULT NULL COMMENT '地图名称',
+    `geo_json`          longtext            DEFAULT NULL COMMENT '地图geoJson',
+    `level`             tinyint(2) NOT NULL DEFAULT 0 COMMENT '地图级别 0-世界 1-国家 2-省 3-市 4-区县',
+    `enable_down`       tinyint(2) NOT NULL DEFAULT 0 COMMENT '是否支持下钻 0-否 1-是',
+    `uploaded_geo_json` tinyint(2) NOT NULL DEFAULT 0 COMMENT '是否已上传geoJson 0-否 1-是',
+    `update_date`       timestamp  NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
+    `create_date`       timestamp  NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `create_by`         bigint(64) null     default 2 comment '创建人',
+    `update_by`         bigint(64) null     default 2 comment '更新人',
+    `del_flag`          tinyint(2) NOT NULL DEFAULT '0' COMMENT '删除标识',
+    PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8 COMMENT ='地图数据维护表';