From fa03f0f2eac072c7a2f52e1b834cde9a8edae6eb Mon Sep 17 00:00:00 2001 From: wuyuan <15505152113@163.com> Date: Fri, 6 Jun 2025 21:43:19 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sample/manage/service/impl/LiveStreamServiceImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java index 5bea65e..c7d0c1c 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java @@ -290,6 +290,9 @@ public class LiveStreamServiceImpl implements ILiveStreamService { return agoraUrl.setSn(videoId.getDroneSn()); case RTMP: LivestreamRtmpUrl rtmpUrl = (LivestreamRtmpUrl) url.clone(); + if(videoId.getDroneSn().equals("7CTXN2T00B07C5")){ + rtmpUrl.setUrl("rtmp://106.13.57.190/live/livesteam/"); + } return rtmpUrl.setUrl(rtmpUrl.getUrl() + videoId.getDroneSn() + "-" + videoId.getPayloadIndex().toString()); case GB28181: String random = String.valueOf(Math.abs(videoId.getDroneSn().hashCode()) % 1000); From 32d0792f9bac78d5bacf797750a71cd7aef1b0c0 Mon Sep 17 00:00:00 2001 From: wuyuan <15505152113@163.com> Date: Fri, 6 Jun 2025 21:44:26 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E9=94=99=E8=AF=AF=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sample/manage/service/impl/LiveStreamServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java index c7d0c1c..abdb543 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java @@ -290,7 +290,7 @@ public class LiveStreamServiceImpl implements ILiveStreamService { return agoraUrl.setSn(videoId.getDroneSn()); case RTMP: LivestreamRtmpUrl rtmpUrl = (LivestreamRtmpUrl) url.clone(); - if(videoId.getDroneSn().equals("7CTXN2T00B07C5")){ + if(videoId.getDroneSn().equals("7CTXN2T00B07C5") || videoId.getDroneSn().equals("1581F6Q8X24CC00G02JB")){ rtmpUrl.setUrl("rtmp://106.13.57.190/live/livesteam/"); } return rtmpUrl.setUrl(rtmpUrl.getUrl() + videoId.getDroneSn() + "-" + videoId.getPayloadIndex().toString()); From 1842065bfcb618e6a2a7a7facaeb8691ee0488ad Mon Sep 17 00:00:00 2001 From: yangwei <867012372@qq.com> Date: Sat, 7 Jun 2025 17:03:50 +0800 Subject: [PATCH 03/10] =?UTF-8?q?[feat]=E6=8F=90=E4=BA=A4=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E9=97=A8=E5=8C=BA=E5=9F=9F=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/SysDepartBoundaryController.java | 6 +- .../dromara/system/domain/kmz/KmzResult.java | 25 ++ .../dromara/system/domain/kmz/Placemark.java | 15 ++ .../impl/SysDepartBoundaryServiceImpl.java | 136 +++++++--- .../dromara/system/utils/KmzParserUtil.java | 240 ++++++++++++++++++ .../org/dromara/system/utils/OvkmzParser.java | 11 - .../dromara/system/utils/ShpAnalysisUtil.java | 55 +++- .../mapper/system/SysDepartBoundaryMapper.xml | 10 +- 8 files changed, 439 insertions(+), 59 deletions(-) create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/kmz/KmzResult.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/domain/kmz/Placemark.java create mode 100644 dk-modules/system/src/main/java/org/dromara/system/utils/KmzParserUtil.java delete mode 100644 dk-modules/system/src/main/java/org/dromara/system/utils/OvkmzParser.java diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDepartBoundaryController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDepartBoundaryController.java index 27dc2e7..4618445 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDepartBoundaryController.java +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDepartBoundaryController.java @@ -59,10 +59,10 @@ public class SysDepartBoundaryController extends BaseController { * @return */ @Operation(summary ="新增部门区域",description = "新增部门区域(areaType: 0:市级 1:区级(县) 2:镇级(街道) 3:村级)") - @RequestMapping(value = "/upload", method = RequestMethod.POST) + @RequestMapping(value = "/{areaType}/{parentId}/upload", method = RequestMethod.POST) public R uploadShpFile(@RequestParam("file") MultipartFile file, - @RequestParam("areaType") Integer areaType, - @RequestParam("parentId") Long parentId) { + @PathVariable Integer areaType, + @PathVariable Long parentId) { return toAjax(departBoundaryService.uploadShpFile(file,areaType,parentId)); } diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/kmz/KmzResult.java b/dk-modules/system/src/main/java/org/dromara/system/domain/kmz/KmzResult.java new file mode 100644 index 0000000..483cc54 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/kmz/KmzResult.java @@ -0,0 +1,25 @@ +package org.dromara.system.domain.kmz; + + +import lombok.Data; + +import java.util.Map; + +@Data +public class KmzResult { + + private String name; + + private Map attributes; + + private String wkt; + + public KmzResult(String name, Map attributes, String wkt) { + this.name = name; + this.attributes = attributes; + this.wkt = wkt; + } + + public KmzResult() { + } +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/kmz/Placemark.java b/dk-modules/system/src/main/java/org/dromara/system/domain/kmz/Placemark.java new file mode 100644 index 0000000..021bf2c --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/kmz/Placemark.java @@ -0,0 +1,15 @@ +package org.dromara.system.domain.kmz; + +import lombok.Data; + +import java.util.Map; + + +@Data +public class Placemark { + + private String name; + private String coordinates; + private Map attributes; + +} diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java index 4c249aa..9bf2751 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java @@ -13,12 +13,14 @@ import org.dromara.system.domain.SysGeospatialVectors; import org.dromara.system.domain.SysVectorDict; import org.dromara.system.domain.bo.SysDepartBoundaryBo; import org.dromara.system.domain.bo.SysDeptBo; +import org.dromara.system.domain.kmz.KmzResult; import org.dromara.system.domain.vo.SysDeptVo; import org.dromara.system.mapper.SysDepartBoundaryMapper; import org.dromara.system.service.ISysDepartBoundaryService; import org.dromara.system.service.ISysDeptService; import org.dromara.system.service.ISysVectorDictService; import org.dromara.system.utils.BatchProcessorUtil; +import org.dromara.system.utils.KmzParserUtil; import org.dromara.system.utils.ShpAnalysisUtil; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.mybatis.core.page.PageQuery; @@ -30,10 +32,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -70,11 +69,14 @@ public class SysDepartBoundaryServiceImpl extends ServiceImpl geospatialVectorsList = buildGeospatialVector(file); //6、生成新的对象集合存储数据表中 List boundaryList = buildBusinessDepartBoundary(geospatialVectorsList,areaType,parentId); + boundaryList = boundaryList.stream().filter(p-> ObjectUtil.isNotEmpty(p.getBoundary())).toList(); + // 分批处理 int startIndex = 0; // 从第 0 条开始 int batchSize = 2000; // 每批处理 2000 条 @@ -97,9 +99,29 @@ public class SysDepartBoundaryServiceImpl extends ServiceImpl buildGeospatialVector(MultipartFile file){ List geospatialVectorsList = new ArrayList<>(); try { + + List> mapList = new ArrayList<>(); + //1、首先调用解析工具拿到解析的字段集合 - InputStream inputStream = file.getInputStream(); - List> mapList = ShpAnalysisUtil.analysisShpFile(inputStream); + if (file.getOriginalFilename().endsWith(".zip")) { + mapList = ShpAnalysisUtil.analysisShpFile(file.getInputStream()); + } else if (file.getOriginalFilename().endsWith(".kmz") || file.getOriginalFilename().endsWith(".ovkmz")) { + List kmzResults = KmzParserUtil.parseKmz(file.getInputStream()); + + List> kmzList = new ArrayList<>(); + kmzResults.forEach(kmzResult -> { + Map map = new HashMap<>(); + Map attributes = kmzResult.getAttributes(); + if (ObjectUtil.isNotEmpty(attributes)) { + map.putAll(attributes); + } + map.put("XZQMC", kmzResult.getName()); + map.put("the_geom", kmzResult.getName()); + kmzList.add(map); + }); + mapList = kmzList; + } + // 3. 构建字典map List fieldsInfoList = vectorDictService.listVectorField(); @@ -224,40 +246,94 @@ public class SysDepartBoundaryServiceImpl extends ServiceImpl item.get("deptName").toString())); geospatialVectorsList.forEach(param->{ - SysDepartBoundary businessDepartBoundary = new SysDepartBoundary(); //获取区划名称 String divisionName = param.getAdminDivisionName(); - businessDepartBoundary.setBoundary(param.getLandCategories()); - //判断是否存在表中,在表中更新部门区域中的部门id信息 - if (ObjectUtil.isNotEmpty(namePathMap.get(divisionName))){ - Map objectMap = namePathMap.get(divisionName).get(0); - businessDepartBoundary.setDeptName(objectMap.get("deptName") + ""); - businessDepartBoundary.setDeptId(Long.valueOf(objectMap.get("deptId") + "")); - businessDepartBoundary.setNamePath(objectMap.get("namePath") + ""); - businessDepartBoundary.setAreaType(areaType); - resultList.add(businessDepartBoundary); - }else { - //如果不存在在部门表中则添加 - SysDeptBo sysDeptBo = new SysDeptBo(); - sysDeptBo.setParentId(parentId); - sysDeptBo.setDeptName(param.getAdminDivisionName()); - - SysDept sysDept = deptService.addBoundaryDept(sysDeptBo); + //是集合 + if (isCollectionString(param.getLandCategories())){ + List geomList = convertStringToList(param.getLandCategories()); + + geomList.forEach(item->{ + SysDepartBoundary businessDepartBoundary = new SysDepartBoundary(); + + businessDepartBoundary.setBoundary(item); + //判断是否存在表中,在表中更新部门区域中的部门id信息 + if (ObjectUtil.isNotEmpty(namePathMap.get(divisionName))){ + Map objectMap = namePathMap.get(divisionName).get(0); + businessDepartBoundary.setDeptName(objectMap.get("deptName") + ""); + businessDepartBoundary.setDeptId(Long.valueOf(objectMap.get("deptId") + "")); + businessDepartBoundary.setNamePath(objectMap.get("namePath") + ""); + businessDepartBoundary.setAreaType(areaType); + resultList.add(businessDepartBoundary); + }else { + //如果不存在在部门表中则添加 + SysDeptBo sysDeptBo = new SysDeptBo(); + sysDeptBo.setParentId(parentId); + sysDeptBo.setDeptName(param.getAdminDivisionName()); + + SysDept sysDept = deptService.addBoundaryDept(sysDeptBo); + + List> deptNamePath = deptService.getNamePathList(sysDept.getDeptId()); + + businessDepartBoundary.setDeptName(sysDept.getDeptName()); + businessDepartBoundary.setDeptId(sysDept.getDeptId()); + businessDepartBoundary.setNamePath(deptNamePath.getFirst().get("namePath").toString()); + businessDepartBoundary.setAreaType(areaType); + resultList.add(businessDepartBoundary); - List> deptNamePath = deptService.getNamePathList(sysDept.getDeptId()); - - businessDepartBoundary.setDeptName(sysDept.getDeptName()); - businessDepartBoundary.setDeptId(sysDept.getDeptId()); - businessDepartBoundary.setNamePath(deptNamePath.getFirst().get("namePath").toString()); - businessDepartBoundary.setAreaType(areaType); - resultList.add(businessDepartBoundary); + } + }); + }else { + SysDepartBoundary businessDepartBoundary = new SysDepartBoundary(); + + businessDepartBoundary.setBoundary(param.getLandCategories()); + //判断是否存在表中,在表中更新部门区域中的部门id信息 + if (ObjectUtil.isNotEmpty(namePathMap.get(divisionName))){ + Map objectMap = namePathMap.get(divisionName).get(0); + businessDepartBoundary.setDeptName(objectMap.get("deptName") + ""); + businessDepartBoundary.setDeptId(Long.valueOf(objectMap.get("deptId") + "")); + businessDepartBoundary.setNamePath(objectMap.get("namePath") + ""); + businessDepartBoundary.setAreaType(areaType); + resultList.add(businessDepartBoundary); + }else { + //如果不存在在部门表中则添加 + SysDeptBo sysDeptBo = new SysDeptBo(); + sysDeptBo.setParentId(parentId); + sysDeptBo.setDeptName(param.getAdminDivisionName()); + + SysDept sysDept = deptService.addBoundaryDept(sysDeptBo); + + List> deptNamePath = deptService.getNamePathList(sysDept.getDeptId()); + + businessDepartBoundary.setDeptName(sysDept.getDeptName()); + businessDepartBoundary.setDeptId(sysDept.getDeptId()); + businessDepartBoundary.setNamePath(deptNamePath.getFirst().get("namePath").toString()); + businessDepartBoundary.setAreaType(areaType); + resultList.add(businessDepartBoundary); + + } } }); return resultList; } + public static List convertStringToList(String str) { + // 去除首尾的 "[" 和 "]" + str = str.substring(1, str.length() - 1); + + // 使用逗号分割 + String[] items = str.split(", "); + + // 返回新的 List + return Arrays.asList(items); + } + + // 判断字符串是否是集合的字符串形式 + public static boolean isCollectionString(String str) { + return str != null && str.startsWith("[") && str.endsWith("]") && str.contains(","); + } + private static String capitalizeFirstLetter(String str) { if (str == null || str.isEmpty()) { diff --git a/dk-modules/system/src/main/java/org/dromara/system/utils/KmzParserUtil.java b/dk-modules/system/src/main/java/org/dromara/system/utils/KmzParserUtil.java new file mode 100644 index 0000000..bc16aa4 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/utils/KmzParserUtil.java @@ -0,0 +1,240 @@ +package org.dromara.system.utils; + +import org.dromara.system.domain.kmz.KmzResult; +import org.dromara.system.domain.kmz.Placemark; + +import java.io.*; +import java.nio.file.*; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +/** + * KMZ文件解析器 + * KMZ是Google Earth使用的压缩格式,包含KML文件和其他资源 + */ +public class KmzParserUtil { + + /** + * 解析KMZ文件的主方法 + * + * @param inputStream KMZ文件的路径 + * @return 解析结果列表 + * @throws IOException 如果文件读取或处理过程中发生错误 + */ + public static List parseKmz(InputStream inputStream) throws IOException { + // 存储解析出的地标信息 + List placemarks = new ArrayList<>(); + // 存储最终结果 + List results = new ArrayList<>(); + + // 创建临时目录用于解压KMZ文件 + Path tempDir = Files.createTempDirectory("kmz_parser_"); + try { + // 将KMZ文件解压到临时目录 + extractKmz(inputStream, tempDir.toString()); + + // 遍历临时目录,查找并解析所有KML文件 + Files.walk(tempDir) + .filter(path -> path.toString().endsWith(".kml")) + .forEach(path -> { + try { + String kmlContent = new String(Files.readAllBytes(path)); + parseKmlContent(kmlContent, placemarks); + } catch (IOException e) { + e.printStackTrace(); + } + }); + + // 将解析出的地标信息转换为最终结果格式 + for (Placemark placemark : placemarks) { + String wkt = convertToWKT(placemark.getCoordinates()); + results.add(new KmzResult(placemark.getName(), placemark.getAttributes(), wkt)); + } + + } finally { + // 清理临时目录 + deleteDirectory(tempDir); + } + + return results; + } + + /** + * 解压KMZ文件到指定目录 + * + * @param inputStream KMZ文件路径 + * @param outputDir 输出目录 + */ + private static void extractKmz(InputStream inputStream, String outputDir) throws IOException { + try (ZipInputStream zis = new ZipInputStream(inputStream)) { + ZipEntry entry; + while ((entry = zis.getNextEntry()) != null) { + Path outputPath = Paths.get(outputDir, entry.getName()); + + // 创建必要的父目录 + Files.createDirectories(outputPath.getParent()); + + // 跳过目录条目 + if (entry.isDirectory()) { + continue; + } + + // 解压文件内容 + try (OutputStream out = Files.newOutputStream(outputPath)) { + byte[] buffer = new byte[1024]; + int len; + while ((len = zis.read(buffer)) > 0) { + out.write(buffer, 0, len); + } + } + } + } + } + + /** + * 递归删除目录及其内容 + * + * @param directory 要删除的目录 + */ + private static void deleteDirectory(Path directory) throws IOException { + Files.walk(directory) + .sorted(Comparator.reverseOrder()) + .forEach(path -> { + try { + Files.delete(path); + } catch (IOException e) { + e.printStackTrace(); + } + }); + } + + /** + * 解析KML文件内容 + * + * @param kmlContent KML文件内容 + * @param placemarks 存储解析出的地标信息 + */ + private static void parseKmlContent(String kmlContent, List placemarks) { + String[] lines = kmlContent.split("\n"); + Placemark currentPlacemark = null; + boolean inDescription = false; + StringBuilder descriptionContent = new StringBuilder(); + + // 添加调试日志 + System.out.println("开始解析KML内容,总行数: " + lines.length); + + for (String line : lines) { + line = line.trim(); + + if (line.startsWith("")) { + if (currentPlacemark != null) { + placemarks.add(currentPlacemark); + } + currentPlacemark = new Placemark(); + System.out.println("发现新的Placemark"); + } else if (line.startsWith("")) { + if (currentPlacemark != null) { + String name = line.replace("", "").replace("", "").trim(); + currentPlacemark.setName(name); + System.out.println("解析到名称: " + name); + } + } else if (line.startsWith("")) { + inDescription = true; + descriptionContent = new StringBuilder(); + System.out.println("开始解析描述"); + } else if (line.endsWith("")) { + inDescription = false; + if (currentPlacemark != null) { + String desc = descriptionContent.toString(); + System.out.println("描述内容: " + desc); + parseDescription(desc, currentPlacemark); + } + } else if (inDescription) { + descriptionContent.append(line).append("\n"); + } else if (line.startsWith("")) { + if (currentPlacemark != null) { + String coords = line.replace("", "").replace("", "").trim(); + currentPlacemark.setCoordinates(coords); + System.out.println("解析到坐标: " + coords); + } + } + } + + if (currentPlacemark != null) { + placemarks.add(currentPlacemark); + } + + // 打印解析结果 + System.out.println("解析完成,共找到 " + placemarks.size() + " 个地标"); + for (Placemark p : placemarks) { + System.out.println("地标信息:"); + System.out.println(" 名称: " + p.getName()); + System.out.println(" 属性: " + p.getAttributes()); + System.out.println(" 坐标: " + p.getCoordinates()); + } + } + + /** + * 解析描述内容,提取属性信息 + * + * @param description 描述内容 + * @param placemark 地标对象 + */ + private static void parseDescription(String description, Placemark placemark) { + System.out.println("开始解析描述内容: " + description); + String[] lines = description.split("\n"); + Map attributes = new HashMap<>(); + for (String line : lines) { + line = line.trim(); + if (line.contains("\":")) { + String[] parts = line.split("\":"); + if (parts.length == 2) { + String key = parts[0].replace("\"", "").trim(); + String value = parts[1].replace("\"", "").trim(); + attributes.put(key, value); + System.out.println("解析到属性 - 键: " + key + ", 值: " + value); + } + } + } + + placemark.setAttributes(attributes); + } + + /** + * 将坐标字符串转换为WKT(Well-Known Text)格式 + * + * @param coordinates 坐标字符串 + * @return WKT格式的字符串 + */ + public static String convertToWKT(String coordinates) { + if (coordinates == null || coordinates.trim().isEmpty()) { + return ""; + } + + // 构建WKT格式的多边形 + StringBuilder wkt = new StringBuilder("POLYGON(("); + String[] coordPairs = coordinates.trim().split("\\s+"); + + // 处理每个坐标对 + for (int i = 0; i < coordPairs.length; i++) { + String[] coords = coordPairs[i].split(","); + if (coords.length >= 2) { + wkt.append(coords[0]).append(" ").append(coords[1]); + if (i < coordPairs.length - 1) { + wkt.append(", "); + } + } + } + + wkt.append("))"); + + StringBuffer polygonSb = new StringBuffer("GEOMETRYCOLLECTION("); + polygonSb.append(wkt); + polygonSb.append(")"); + + return polygonSb.toString(); + } +} + + diff --git a/dk-modules/system/src/main/java/org/dromara/system/utils/OvkmzParser.java b/dk-modules/system/src/main/java/org/dromara/system/utils/OvkmzParser.java deleted file mode 100644 index 38aa2dd..0000000 --- a/dk-modules/system/src/main/java/org/dromara/system/utils/OvkmzParser.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.dromara.system.utils; - - -/** - * 解析ovkmz文件 - */ -public class OvkmzParser { - - - -} diff --git a/dk-modules/system/src/main/java/org/dromara/system/utils/ShpAnalysisUtil.java b/dk-modules/system/src/main/java/org/dromara/system/utils/ShpAnalysisUtil.java index e2a384e..cbef891 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/utils/ShpAnalysisUtil.java +++ b/dk-modules/system/src/main/java/org/dromara/system/utils/ShpAnalysisUtil.java @@ -45,6 +45,7 @@ public class ShpAnalysisUtil { /** * 读取shp文件,返回要素集合 + * * @param shpPath shp文件路径 * @return 要素集合,包含地理位置和属性信息 */ @@ -52,7 +53,7 @@ public class ShpAnalysisUtil { List> resultList = new ArrayList<>(); try { - resultList=analysisShpFile(shpPath, "GBK"); + resultList = analysisShpFile(shpPath, "GBK"); } catch (Exception e) { log.error("无法使用支持的字符编码读取shp文件: {}", e.getMessage()); } @@ -62,6 +63,7 @@ public class ShpAnalysisUtil { /** * 读取shp文件,返回要素集合 + * * @param shpInputStream shp文件输入流 * @return 要素集合,包含地理位置和属性信息 */ @@ -81,7 +83,7 @@ public class ShpAnalysisUtil { * 读取shp文件的主要方法(仅支持ZIP输入流) * * @param shpInputStream shp文件ZIP输入流 - * @param charset 字符编码 + * @param charset 字符编码 * @return 要素集合,包含地理位置和属性信息 * @throws IllegalArgumentException 如果输入流不是ZIP格式 */ @@ -102,7 +104,7 @@ public class ShpAnalysisUtil { boolean shpFound = false; while ((entry = zipInputStream.getNextEntry()) != null) { // 处理文件名编码问题 - log.info("文件名字:{}",entry.getName()); + log.info("文件名字:{}", entry.getName()); File outputFile = new File(tempDir, entry.getName()); // 创建父目录 @@ -296,22 +298,25 @@ public class ShpAnalysisUtil { } - private static String analysisGeometry(Geometry geometry, MathTransform transform) throws TransformException { - String resultStr = ""; + private static Object analysisGeometry(Geometry geometry, MathTransform transform) throws TransformException { // 对每个 Polygon 进行坐标转换 Geometry transformedGeometry = JTS.transform(geometry, transform); MultiPolygon multiPolygon = (MultiPolygon) transformedGeometry; Geometry unionGeometry = UnaryUnionOp.union(multiPolygon); if (unionGeometry instanceof Polygon) { Polygon polygon = (Polygon) unionGeometry; - resultStr = convertPolygonToWKT(polygon); + return convertPolygonToWKT(polygon); + + } else if (unionGeometry instanceof MultiPolygon) { + MultiPolygon muPolygon = (MultiPolygon) unionGeometry; + + return convertMultiPolygonToWKT(muPolygon); } - return resultStr; + return ""; } - private static String convertPolygonToWKT(Polygon polygon) { StringBuffer polygonSb = new StringBuffer("GEOMETRYCOLLECTION(POLYGON(("); @@ -321,16 +326,45 @@ public class ShpAnalysisUtil { if (i > 0) polygonSb.append(","); polygonSb.append(coord.y + " " + coord.x); } - if(coordinates[0].x !=coordinates[coordinates.length-1].x){ - polygonSb.append(","+coordinates[0].y + " " + coordinates[0].x); + if (coordinates[0].x != coordinates[coordinates.length - 1].x) { + polygonSb.append("," + coordinates[0].y + " " + coordinates[0].x); } polygonSb.append(")))"); return polygonSb.toString(); } + private static List convertMultiPolygonToWKT(MultiPolygon multiPolygon) { + + List resultList = new ArrayList<>(); + + // 获取 MultiPolygon 中的每个 Polygon + for (int j = 0; j < multiPolygon.getNumGeometries(); j++) { + Polygon polygon = (Polygon) multiPolygon.getGeometryN(j); + + StringBuffer polygonSb = new StringBuffer("GEOMETRYCOLLECTION(POLYGON(("); + + Coordinate[] coordinates = polygon.getCoordinates(); + for (int i = 0; i < coordinates.length; i++) { + Coordinate coord = coordinates[i]; + if (i > 0) polygonSb.append(","); + polygonSb.append(coord.y + " " + coord.x); + } + if (coordinates[0].x != coordinates[coordinates.length - 1].x) { + polygonSb.append("," + coordinates[0].y + " " + coordinates[0].x); + } + polygonSb.append(")))"); + + resultList.add(polygonSb.toString()); + } + + return resultList; + + } + /** * 递归删除目录 + * * @param directory 要删除的目录 */ private static void deleteDirectory(File directory) { @@ -356,6 +390,7 @@ public class ShpAnalysisUtil { /** * 在指定目录中查找第一个.shp文件 + * * @param directory 搜索目录 * @return 找到的第一个.shp文件,未找到返回null */ diff --git a/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml b/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml index bf0fc36..822c8f9 100644 --- a/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml +++ b/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml @@ -7,7 +7,7 @@ db.dept_id, db.dept_name, db.type, - db.community_name, + db.name_path, CONCAT( REPLACE ( REPLACE ( REPLACE ( REPLACE ( ST_AsText ( db.boundary ), 'GEOMETRYCOLLECTION(POLYGON((', '[[' ), ')))', ']]' ), ',', '],[' ), ' ', ',' ) ) AS boundary, @@ -20,8 +20,8 @@ and (db.dept_id = #{condition.deptId} or d.parent_id = #{condition.deptId}) - - and db.community_name like concat(concat('%',#{condition.communityName}),'%') + + and db.name_path like concat(concat('%',#{condition.namePath}),'%') @@ -34,7 +34,7 @@ db.dept_id, db.dept_name, db.type, - db.community_name, + db.name_path, CONCAT( REPLACE ( REPLACE ( REPLACE ( REPLACE ( ST_AsText ( db.boundary ), 'GEOMETRYCOLLECTION(POLYGON((', '[[' ), ')))', ']]' ), ',', '],[' ), ' ', ',' ) ) AS boundary, @@ -63,7 +63,7 @@ db.dept_id, db.dept_name, db.type, - db.community_name, + db.name_path, CONCAT( REPLACE ( REPLACE ( REPLACE ( REPLACE ( ST_AsText ( db.boundary ), 'GEOMETRYCOLLECTION(POLYGON((', '[[' ), ')))', ']]' ), ',', '],[' ), ' ', ',' ) ) AS boundary, From 7d9bf35f45f36537a76a0c0c64b688258ef32afd Mon Sep 17 00:00:00 2001 From: yangwei <867012372@qq.com> Date: Sat, 7 Jun 2025 17:20:37 +0800 Subject: [PATCH 04/10] =?UTF-8?q?[feat]=E6=8F=90=E4=BA=A4=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E9=97=A8=E5=8C=BA=E5=9F=9F=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E9=80=BB=E8=BE=91=E2=91=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SysDepartBoundaryServiceImpl.java | 2 +- .../dromara/system/utils/KmzParserUtil.java | 33 +++++++++++++++---- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java index 9bf2751..15bd7b1 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java @@ -116,7 +116,7 @@ public class SysDepartBoundaryServiceImpl extends ServiceImpl currentCoordinates, List placemarks) { + if (currentPlacemark != null && !currentCoordinates.isEmpty()) { + for (String coords : currentCoordinates) { + Placemark newPlacemark = new Placemark(); + newPlacemark.setName(currentPlacemark.getName()); + newPlacemark.setAttributes(new HashMap<>(currentPlacemark.getAttributes())); + newPlacemark.setCoordinates(coords); + placemarks.add(newPlacemark); + } + } + } + /** * 解析KML文件内容 * @@ -120,6 +139,7 @@ public class KmzParserUtil { Placemark currentPlacemark = null; boolean inDescription = false; StringBuilder descriptionContent = new StringBuilder(); + List currentCoordinates = new ArrayList<>(); // 添加调试日志 System.out.println("开始解析KML内容,总行数: " + lines.length); @@ -128,10 +148,10 @@ public class KmzParserUtil { line = line.trim(); if (line.startsWith("")) { - if (currentPlacemark != null) { - placemarks.add(currentPlacemark); - } + // 处理当前Placemark的所有坐标 + processCurrentPlacemarkCoordinates(currentPlacemark, currentCoordinates, placemarks); currentPlacemark = new Placemark(); + currentCoordinates = new ArrayList<>(); System.out.println("发现新的Placemark"); } else if (line.startsWith("")) { if (currentPlacemark != null) { @@ -155,15 +175,14 @@ public class KmzParserUtil { } else if (line.startsWith("")) { if (currentPlacemark != null) { String coords = line.replace("", "").replace("", "").trim(); - currentPlacemark.setCoordinates(coords); + currentCoordinates.add(coords); System.out.println("解析到坐标: " + coords); } } } - if (currentPlacemark != null) { - placemarks.add(currentPlacemark); - } + // 处理最后一个Placemark + processCurrentPlacemarkCoordinates(currentPlacemark, currentCoordinates, placemarks); // 打印解析结果 System.out.println("解析完成,共找到 " + placemarks.size() + " 个地标"); From e965a29259b66222be0eafde1f306d1d732e7cad Mon Sep 17 00:00:00 2001 From: yangwei <867012372@qq.com> Date: Sat, 7 Jun 2025 17:29:34 +0800 Subject: [PATCH 05/10] =?UTF-8?q?[feat]=E6=8F=90=E4=BA=A4=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E9=97=A8=E5=8C=BA=E5=9F=9F=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E9=80=BB=E8=BE=91=E2=91=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/SysDepartBoundaryServiceImpl.java | 78 ++++++++----------- 1 file changed, 31 insertions(+), 47 deletions(-) diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java index 15bd7b1..410c2de 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java @@ -257,67 +257,51 @@ public class SysDepartBoundaryServiceImpl extends ServiceImpl objectMap = namePathMap.get(divisionName).get(0); - businessDepartBoundary.setDeptName(objectMap.get("deptName") + ""); - businessDepartBoundary.setDeptId(Long.valueOf(objectMap.get("deptId") + "")); - businessDepartBoundary.setNamePath(objectMap.get("namePath") + ""); - businessDepartBoundary.setAreaType(areaType); - resultList.add(businessDepartBoundary); - }else { - //如果不存在在部门表中则添加 - SysDeptBo sysDeptBo = new SysDeptBo(); - sysDeptBo.setParentId(parentId); - sysDeptBo.setDeptName(param.getAdminDivisionName()); - - SysDept sysDept = deptService.addBoundaryDept(sysDeptBo); - - List> deptNamePath = deptService.getNamePathList(sysDept.getDeptId()); - - businessDepartBoundary.setDeptName(sysDept.getDeptName()); - businessDepartBoundary.setDeptId(sysDept.getDeptId()); - businessDepartBoundary.setNamePath(deptNamePath.getFirst().get("namePath").toString()); - businessDepartBoundary.setAreaType(areaType); - resultList.add(businessDepartBoundary); - } + createBoundary(businessDepartBoundary,namePathMap,divisionName,areaType,parentId); + + resultList.add(businessDepartBoundary); }); }else { SysDepartBoundary businessDepartBoundary = new SysDepartBoundary(); businessDepartBoundary.setBoundary(param.getLandCategories()); - //判断是否存在表中,在表中更新部门区域中的部门id信息 - if (ObjectUtil.isNotEmpty(namePathMap.get(divisionName))){ - Map objectMap = namePathMap.get(divisionName).get(0); - businessDepartBoundary.setDeptName(objectMap.get("deptName") + ""); - businessDepartBoundary.setDeptId(Long.valueOf(objectMap.get("deptId") + "")); - businessDepartBoundary.setNamePath(objectMap.get("namePath") + ""); - businessDepartBoundary.setAreaType(areaType); - resultList.add(businessDepartBoundary); - }else { - //如果不存在在部门表中则添加 - SysDeptBo sysDeptBo = new SysDeptBo(); - sysDeptBo.setParentId(parentId); - sysDeptBo.setDeptName(param.getAdminDivisionName()); - - SysDept sysDept = deptService.addBoundaryDept(sysDeptBo); - List> deptNamePath = deptService.getNamePathList(sysDept.getDeptId()); + createBoundary(businessDepartBoundary,namePathMap,divisionName,areaType,parentId); - businessDepartBoundary.setDeptName(sysDept.getDeptName()); - businessDepartBoundary.setDeptId(sysDept.getDeptId()); - businessDepartBoundary.setNamePath(deptNamePath.getFirst().get("namePath").toString()); - businessDepartBoundary.setAreaType(areaType); - resultList.add(businessDepartBoundary); - - } + resultList.add(businessDepartBoundary); } }); return resultList; } + private void createBoundary(SysDepartBoundary businessDepartBoundary, Map>> namePathMap, String divisionName, Integer areaType, Long parentId) { + //判断是否存在表中,在表中更新部门区域中的部门id信息 + if (ObjectUtil.isNotEmpty(namePathMap.get(divisionName))){ + Map objectMap = namePathMap.get(divisionName).get(0); + businessDepartBoundary.setDeptName(objectMap.get("deptName") + ""); + businessDepartBoundary.setDeptId(Long.valueOf(objectMap.get("deptId") + "")); + businessDepartBoundary.setNamePath(objectMap.get("namePath") + ""); + businessDepartBoundary.setAreaType(areaType); + }else { + //如果不存在在部门表中则添加 + SysDeptBo sysDeptBo = new SysDeptBo(); + sysDeptBo.setParentId(parentId); + sysDeptBo.setDeptName(divisionName); + + SysDept sysDept = deptService.addBoundaryDept(sysDeptBo); + + List> deptNamePath = deptService.getNamePathList(sysDept.getDeptId()); + + businessDepartBoundary.setDeptName(sysDept.getDeptName()); + businessDepartBoundary.setDeptId(sysDept.getDeptId()); + businessDepartBoundary.setNamePath(deptNamePath.getFirst().get("namePath").toString()); + businessDepartBoundary.setAreaType(areaType); + } + } + + public static List convertStringToList(String str) { // 去除首尾的 "[" 和 "]" str = str.substring(1, str.length() - 1); From bd6dccb6bf3bc21d608979707235d33755e40cfc Mon Sep 17 00:00:00 2001 From: shizisheng Date: Mon, 9 Jun 2025 08:59:23 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E5=8D=97=E9=80=9A=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E6=8C=87=E5=AE=9A=E5=9B=BA=E5=AE=9Artmpl=E8=B7=AF=E5=BE=84-?= =?UTF-8?q?=E5=85=B3=E9=97=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/LiveStreamServiceImpl.java | 39 +++++++++++++------ 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java index abdb543..6cc2434 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/LiveStreamServiceImpl.java @@ -1,29 +1,27 @@ package org.dromara.sample.manage.service.impl; -import cn.hutool.core.convert.Convert; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import jakarta.annotation.Resource; -import org.apache.commons.collections.CollectionUtils; -import org.dromara.common.rocketmq.producer.MessageProducerUtil; +import org.apache.dubbo.config.annotation.DubboReference; import org.dromara.common.sdk.cloudapi.device.DeviceDomainEnum; import org.dromara.common.sdk.cloudapi.device.VideoId; import org.dromara.common.sdk.cloudapi.livestream.*; import org.dromara.common.sdk.cloudapi.livestream.api.AbstractLivestreamService; -import org.dromara.common.sdk.cloudapi.wayline.FlighttaskProgress; import org.dromara.common.sdk.common.HttpResultResponse; import org.dromara.common.sdk.common.SDKManager; -import org.dromara.common.sdk.mqtt.CommonTopicRequest; import org.dromara.common.sdk.mqtt.MqttGatewayPublish; import org.dromara.common.sdk.mqtt.services.ServicesReplyData; import org.dromara.common.sdk.mqtt.services.TopicServicesResponse; -import org.dromara.sample.component.mqtt.model.EventsReceiver; import org.dromara.sample.feign.RemoteSystemFeign; import org.dromara.sample.manage.model.dto.*; -import org.dromara.sample.manage.model.entity.DeviceEntity; import org.dromara.sample.manage.model.param.DeviceQueryParam; import org.dromara.sample.manage.service.*; -import org.dromara.sample.wayline.model.dto.WaylineJobDTO; import org.dromara.sample.wayline.service.IWaylineJobService; import org.dromara.sample.wayline.service.IWaylineRedisService; +import org.dromara.system.api.RemoteDictService; +import org.dromara.system.api.domain.vo.RemoteDictDataVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -70,6 +68,9 @@ public class LiveStreamServiceImpl implements ILiveStreamService { @Resource private RemoteSystemFeign remoteSystemFeign; + @DubboReference + private RemoteDictService remoteDictService; + @Override public List getLiveCapacity(String workspaceId) { @@ -290,9 +291,25 @@ public class LiveStreamServiceImpl implements ILiveStreamService { return agoraUrl.setSn(videoId.getDroneSn()); case RTMP: LivestreamRtmpUrl rtmpUrl = (LivestreamRtmpUrl) url.clone(); - if(videoId.getDroneSn().equals("7CTXN2T00B07C5") || videoId.getDroneSn().equals("1581F6Q8X24CC00G02JB")){ - rtmpUrl.setUrl("rtmp://106.13.57.190/live/livesteam/"); - } + //南通设备指定固定rtmpl路径 功能关闭 + /* List dictDataVoList = remoteDictService.selectDictDataByType("drone_stream_rtmp"); + for (RemoteDictDataVo remoteDictDataVo : dictDataVoList) { + if(JSONUtil.isTypeJSON(remoteDictDataVo.getRemark())){ + JSONArray jsonArr = JSONUtil.parseArray(remoteDictDataVo.getRemark()); + for (Object obj : jsonArr) { + JSONObject entries = new JSONObject(obj); + String droneSnStr = entries.getStr("droneSn"); + String rtmpUrlStr = entries.getStr("rtmpUrl"); + if(videoId.getDroneSn().equals(droneSnStr) ){ + rtmpUrl.setUrl(rtmpUrlStr); + } + } + } + }*/ + +// if(videoId.getDroneSn().equals("7CTXN2T00B07C5") || videoId.getDroneSn().equals("1581F6Q8X24CC00G02JB")){ +// rtmpUrl.setUrl("rtmp://106.13.57.190/live/livesteam/"); +// } return rtmpUrl.setUrl(rtmpUrl.getUrl() + videoId.getDroneSn() + "-" + videoId.getPayloadIndex().toString()); case GB28181: String random = String.valueOf(Math.abs(videoId.getDroneSn().hashCode()) % 1000); From 2a1b1b682a1590c1162f2e3abc582868b6daf8ec Mon Sep 17 00:00:00 2001 From: yangwei <867012372@qq.com> Date: Mon, 9 Jun 2025 15:32:16 +0800 Subject: [PATCH 07/10] =?UTF-8?q?[feat]=E6=8F=90=E4=BA=A4=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E9=97=A8=E5=8C=BA=E5=9F=9F=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E9=80=BB=E8=BE=91=E2=91=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../system/SysDepartBoundaryController.java | 16 ++ .../system/domain/SysDepartBoundary.java | 7 +- .../mapper/SysDepartBoundaryMapper.java | 1 + .../service/ISysDepartBoundaryService.java | 4 +- .../impl/SysDepartBoundaryServiceImpl.java | 33 ++++- .../dromara/system/utils/KmlParserUtil.java | 140 ++++++++++++++++++ .../mapper/system/SysDepartBoundaryMapper.xml | 78 +++++++--- 7 files changed, 253 insertions(+), 26 deletions(-) create mode 100644 dk-modules/system/src/main/java/org/dromara/system/utils/KmlParserUtil.java diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDepartBoundaryController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDepartBoundaryController.java index 4618445..a123090 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDepartBoundaryController.java +++ b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDepartBoundaryController.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.web.core.BaseController; @@ -58,6 +59,7 @@ public class SysDepartBoundaryController extends BaseController { * 解析shp文件 * @return */ + @RepeatSubmit() @Operation(summary ="新增部门区域",description = "新增部门区域(areaType: 0:市级 1:区级(县) 2:镇级(街道) 3:村级)") @RequestMapping(value = "/{areaType}/{parentId}/upload", method = RequestMethod.POST) public R uploadShpFile(@RequestParam("file") MultipartFile file, @@ -67,6 +69,20 @@ public class SysDepartBoundaryController extends BaseController { } + /** + * 根据经纬度查询部门信息 + * @param lat、lng + * @return + */ + @Operation(summary ="根据经纬度查询部门信息",description = "根据经纬度查询部门信息") + @GetMapping(value = "/location/list") + public R> listDepartBoundaryByLngAndLat(@RequestParam("lat") Double lat, + @RequestParam("lng") Double lng) { + List listJson = departBoundaryService.listDepartBoundaryByLngAndLat(lng,lat); + return R.ok(listJson); + } + + /** * 通过id删除 * diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/SysDepartBoundary.java b/dk-modules/system/src/main/java/org/dromara/system/domain/SysDepartBoundary.java index 7398145..c1abc95 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/domain/SysDepartBoundary.java +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/SysDepartBoundary.java @@ -23,7 +23,7 @@ public class SysDepartBoundary extends BaseEntity { /**ID*/ @TableId(type = IdType.AUTO) - private String id; + private Long id; /**机构ID*/ private Long deptId; @@ -42,6 +42,11 @@ public class SysDepartBoundary extends BaseEntity { */ private Integer areaType; + /** + * 父类id + */ + private Long parentId; + /**删除状态(0,正常,1已删除)*/ private String delFlag; diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/SysDepartBoundaryMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/SysDepartBoundaryMapper.java index 01ed7fd..e075336 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/mapper/SysDepartBoundaryMapper.java +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/SysDepartBoundaryMapper.java @@ -26,4 +26,5 @@ public interface SysDepartBoundaryMapper extends BaseMapper { String listJson(@Param("deptId") String deptId); + List listDepartBoundaryByLngAndLat(@Param("lng") Double lng,@Param("lat") Double lat); } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/ISysDepartBoundaryService.java b/dk-modules/system/src/main/java/org/dromara/system/service/ISysDepartBoundaryService.java index 71e5c5a..44861bb 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/ISysDepartBoundaryService.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/ISysDepartBoundaryService.java @@ -22,11 +22,13 @@ public interface ISysDepartBoundaryService extends IService{ boolean uploadShpFile(MultipartFile file,Integer areaType,Long parentId); - boolean deleteDepartBoundary(String id); + boolean deleteDepartBoundary(String deptId); boolean updateDepartBoundary(SysDepartBoundary departBoundary); boolean addDepartBoundary(SysDepartBoundary departBoundary); List listJson(SysDepartBoundary departBoundary); + + List listDepartBoundaryByLngAndLat(Double lng, Double lat); } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java index 410c2de..c569c5d 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java @@ -1,6 +1,7 @@ package org.dromara.system.service.impl; import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -20,6 +21,7 @@ import org.dromara.system.service.ISysDepartBoundaryService; import org.dromara.system.service.ISysDeptService; import org.dromara.system.service.ISysVectorDictService; import org.dromara.system.utils.BatchProcessorUtil; +import org.dromara.system.utils.KmlParserUtil; import org.dromara.system.utils.KmzParserUtil; import org.dromara.system.utils.ShpAnalysisUtil; import org.dromara.common.core.exception.ServiceException; @@ -104,8 +106,11 @@ public class SysDepartBoundaryServiceImpl extends ServiceImpl kmzResults = KmzParserUtil.parseKmz(file.getInputStream()); List> kmzList = new ArrayList<>(); @@ -120,9 +125,11 @@ public class SysDepartBoundaryServiceImpl extends ServiceImpl fieldsInfoList = vectorDictService.listVectorField(); @@ -219,16 +226,31 @@ public class SysDepartBoundaryServiceImpl extends ServiceImpl listDepartBoundaryByLngAndLat(Double lng, Double lat) { + + return this.baseMapper.listDepartBoundaryByLngAndLat(lng,lat); + } + @Override - public boolean deleteDepartBoundary(String id) { - SysDepartBoundary departBoundary = this.baseMapper.selectById(id); + public boolean deleteDepartBoundary(String deptId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(SysDepartBoundary::getDeptId,deptId); + + List sysDepartBoundaries = this.baseMapper.selectList(wrapper); - if (ObjectUtil.isEmpty(departBoundary)) { + if (ObjectUtil.isEmpty(sysDepartBoundaries)) { throw new ServiceException("实体不存在!"); } - return this.baseMapper.deleteById(departBoundary.getId())>0; + return this.baseMapper.deleteByIds(sysDepartBoundaries.stream().map(SysDepartBoundary::getId).distinct().toList())>0; } @@ -277,6 +299,7 @@ public class SysDepartBoundaryServiceImpl extends ServiceImpl>> namePathMap, String divisionName, Integer areaType, Long parentId) { + businessDepartBoundary.setParentId(parentId); //判断是否存在表中,在表中更新部门区域中的部门id信息 if (ObjectUtil.isNotEmpty(namePathMap.get(divisionName))){ Map objectMap = namePathMap.get(divisionName).get(0); diff --git a/dk-modules/system/src/main/java/org/dromara/system/utils/KmlParserUtil.java b/dk-modules/system/src/main/java/org/dromara/system/utils/KmlParserUtil.java new file mode 100644 index 0000000..b1a8767 --- /dev/null +++ b/dk-modules/system/src/main/java/org/dromara/system/utils/KmlParserUtil.java @@ -0,0 +1,140 @@ +package org.dromara.system.utils; + +import cn.hutool.core.util.ObjectUtil; + +import java.io.*; +import java.util.*; + +/** + * KML文件解析器 + * KML是Google Earth使用的标记语言格式 + */ +public class KmlParserUtil { + + /** + * 从KML内容中提取所有Placemark数据 + * + * @param kmlContent KML内容 + * @return 包含name和coordinates的Map列表 + */ + public static List> extractPlacemarks(String kmlContent) { + List> placemarkList = new ArrayList<>(); + int startIndex = 0; + + while (true) { + // 查找Placemark开始标签 + int startPlacemark = kmlContent.indexOf("", startIndex); + if (startPlacemark == -1) { + break; + } + + // 查找Placemark结束标签 + int endPlacemark = kmlContent.indexOf("", startPlacemark); + if (endPlacemark == -1) { + break; + } + + // 提取当前Placemark的内容 + String placemarkContent = kmlContent.substring(startPlacemark, endPlacemark + "".length()); + + // 提取name + String name = ""; + int nameStart = placemarkContent.indexOf(""); + int nameEnd = placemarkContent.indexOf(""); + if (nameStart != -1 && nameEnd != -1) { + name = placemarkContent.substring(nameStart + "".length(), nameEnd).trim(); + } + + // 提取coordinates + String coordinates = ""; + int coordStart = placemarkContent.indexOf(""); + int coordEnd = placemarkContent.indexOf(""); + if (coordStart != -1 && coordEnd != -1) { + coordinates = placemarkContent.substring(coordStart + "".length(), coordEnd).trim(); + } + + //提取 + if (ObjectUtil.isEmpty(name)){ + int dataStart = placemarkContent.indexOf("Data name =\"name\""); + if (dataStart != -1) { + int valueStart = placemarkContent.indexOf("", dataStart); + int valueEnd = placemarkContent.indexOf("", valueStart); + if (valueStart != -1 && valueEnd != -1) { + name = placemarkContent.substring(valueStart + "".length(), valueEnd).trim(); + } + } + } + + + // 创建Map并添加到列表 + Map placemarkMap = new HashMap<>(); + placemarkMap.put("XZQMC", name); + + String wkt = convertToWKT(coordinates); + + placemarkMap.put("the_geom", wkt); + + placemarkList.add(placemarkMap); + + // 更新搜索起始位置 + startIndex = endPlacemark + "".length(); + } + + return placemarkList; + } + + /** + * 将坐标字符串转换为WKT(Well-Known Text)格式 + * + * @param coordinates 坐标字符串 + * @return WKT格式的字符串 + */ + public static String convertToWKT(String coordinates) { + if (coordinates == null || coordinates.trim().isEmpty()) { + return ""; + } + + // 构建WKT格式的多边形 + StringBuilder wkt = new StringBuilder("POLYGON(("); + String[] coordPairs = coordinates.trim().split("\\s+"); + + // 处理每个坐标对 + for (int i = 0; i < coordPairs.length; i++) { + String[] coords = coordPairs[i].split(","); + if (coords.length >= 2) { + wkt.append(coords[0]).append(" ").append(coords[1]); + if (i < coordPairs.length - 1) { + wkt.append(", "); + } + } + } + + wkt.append("))"); + + StringBuffer polygonSb = new StringBuffer("GEOMETRYCOLLECTION("); + polygonSb.append(wkt); + polygonSb.append(")"); + + return polygonSb.toString(); + } + + /** + * 解析KML文件的主方法 + * + * @param inputStream KML文件的输入流 + * @return 包含name和coordinates的Map列表 + * @throws IOException 如果文件读取或处理过程中发生错误 + */ + public static List> parseKml(InputStream inputStream) throws IOException { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + StringBuilder kmlContent = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + kmlContent.append(line).append("\n"); + } + return extractPlacemarks(kmlContent.toString()); + } + } +} + + diff --git a/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml b/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml index 822c8f9..c4cb403 100644 --- a/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml +++ b/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml @@ -3,27 +3,52 @@ @@ -33,7 +58,7 @@ db.id, db.dept_id, db.dept_name, - db.type, + db.area_type, db.name_path, CONCAT( REPLACE ( REPLACE ( REPLACE ( REPLACE ( ST_AsText ( db.boundary ), 'GEOMETRYCOLLECTION(POLYGON((', '[[' ), ')))', ']]' ), ',', '],[' ), ' ', ',' ) @@ -62,7 +87,7 @@ db.id, db.dept_id, db.dept_name, - db.type, + db.area_type, db.name_path, CONCAT( REPLACE ( REPLACE ( REPLACE ( REPLACE ( ST_AsText ( db.boundary ), 'GEOMETRYCOLLECTION(POLYGON((', '[[' ), ')))', ']]' ), ',', '],[' ), ' ', ',' ) @@ -82,6 +107,7 @@ name_path, boundary, area_type, + parent_id, create_by, create_time, update_by, @@ -95,6 +121,7 @@ #{item.namePath}, ST_GeomFromText(#{item.boundary}), #{item.areaType}, + #{item.parentId}, #{item.createBy}, #{item.createTime}, #{item.updateBy}, @@ -135,4 +162,17 @@ d.dept_id = #{deptId} + + From a4741ec93e32f77380859e173d8022083d8ced4f Mon Sep 17 00:00:00 2001 From: yangwei <867012372@qq.com> Date: Mon, 9 Jun 2025 16:09:17 +0800 Subject: [PATCH 08/10] =?UTF-8?q?[feat]=E6=8F=90=E4=BA=A4=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E9=97=A8=E5=8C=BA=E5=9F=9F=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E9=80=BB=E8=BE=91=E2=91=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/system/domain/SysDepartBoundary.java | 4 ++++ .../service/impl/SysDepartBoundaryServiceImpl.java | 9 ++++++++- .../java/org/dromara/system/utils/KmlParserUtil.java | 2 +- .../resources/mapper/system/SysDepartBoundaryMapper.xml | 7 +++++++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/dk-modules/system/src/main/java/org/dromara/system/domain/SysDepartBoundary.java b/dk-modules/system/src/main/java/org/dromara/system/domain/SysDepartBoundary.java index c1abc95..e2b96d9 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/domain/SysDepartBoundary.java +++ b/dk-modules/system/src/main/java/org/dromara/system/domain/SysDepartBoundary.java @@ -1,6 +1,7 @@ package org.dromara.system.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; @@ -50,4 +51,7 @@ public class SysDepartBoundary extends BaseEntity { /**删除状态(0,正常,1已删除)*/ private String delFlag; + @TableField(exist = false) + private List deptIds; + } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java index c569c5d..4256e16 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDepartBoundaryServiceImpl.java @@ -51,6 +51,13 @@ public class SysDepartBoundaryServiceImpl extends ServiceImpl listSysDepartBoundary(PageQuery pageQuery, SysDepartBoundary departBoundary) { + if (ObjectUtil.isNotEmpty(departBoundary.getDeptId())){ + List deptList = deptService.listTreeDept(departBoundary.getDeptId()); + + departBoundary.setDeptIds(deptList.stream().map(SysDeptVo::getDeptId).distinct().toList()); + } + + Page page = baseMapper.listSysDepartBoundary(pageQuery.build(),departBoundary); return TableDataInfo.build(page); @@ -120,7 +127,7 @@ public class SysDepartBoundaryServiceImpl extends ServiceImpl placemarkMap = new HashMap<>(); - placemarkMap.put("XZQMC", name); + placemarkMap.put("O_NAME", name); String wkt = convertToWKT(coordinates); diff --git a/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml b/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml index c4cb403..185d183 100644 --- a/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml +++ b/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml @@ -49,6 +49,13 @@ and t.dept_name like concat(concat('%',#{condition.deptName}),'%') + + + and t.dept_id in + + #{item} + + From 2c0c9cbcdda43e741e1960b886159275a45f078e Mon Sep 17 00:00:00 2001 From: yangwei <867012372@qq.com> Date: Mon, 9 Jun 2025 16:13:48 +0800 Subject: [PATCH 09/10] =?UTF-8?q?[feat]=E6=8F=90=E4=BA=A4=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=83=A8=E9=97=A8=E5=8C=BA=E5=9F=9F=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E9=80=BB=E8=BE=91=E2=91=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/mapper/system/SysDepartBoundaryMapper.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml b/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml index 185d183..9c87bd2 100644 --- a/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml +++ b/dk-modules/system/src/main/resources/mapper/system/SysDepartBoundaryMapper.xml @@ -57,6 +57,7 @@ + order by t.create_time desc From 9267b2b48f59325b7544640e0622ffcfb998d428 Mon Sep 17 00:00:00 2001 From: yangwei <867012372@qq.com> Date: Mon, 9 Jun 2025 17:27:21 +0800 Subject: [PATCH 10/10] =?UTF-8?q?[feat]=E6=8F=90=E4=BA=A4=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=BE=E5=B1=82=E7=AE=A1=E7=90=86=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E2=91=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/system/api/RemoteDeptService.java | 2 ++ .../controller/BusinessLayerController.java | 8 ++--- .../business/domain/vo/BusinessLayerVo.java | 3 ++ .../impl/BusinessLayerServiceImpl.java | 25 +++++++++++----- .../system/dubbo/RemoteDeptServiceImpl.java | 7 +++++ .../dromara/system/mapper/SysDeptMapper.java | 2 ++ .../system/service/ISysDeptService.java | 2 ++ .../service/impl/SysDeptServiceImpl.java | 5 ++++ .../dromara/system/utils/KmzParserUtil.java | 5 +++- .../resources/mapper/system/SysDeptMapper.xml | 30 +++++++++++++++++++ 10 files changed, 77 insertions(+), 12 deletions(-) diff --git a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java index 0277739..13cc9c3 100644 --- a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java +++ b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteDeptService.java @@ -29,4 +29,6 @@ public interface RemoteDeptService { List selectListByParentId(String deptId); RemoteDeptVo getByParentId(String deptId); + + List listTreeDeptByChild(Long deptId); } diff --git a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessLayerController.java b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessLayerController.java index 1595700..112b46c 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessLayerController.java +++ b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessLayerController.java @@ -38,7 +38,7 @@ public class BusinessLayerController extends BaseController { * 图层模块列表 */ @Operation(summary ="图层模块列表",description = "图层模块列表") - @SaCheckPermission("business:layer:list") +// @SaCheckPermission("business:layer:list") @GetMapping("/list") public R> list(BusinessLayerBo bo, PageQuery pageQuery) { return R.ok(businessLayerService.queryPageList(bo, pageQuery)); @@ -54,7 +54,7 @@ public class BusinessLayerController extends BaseController { * 图层新增 */ @Operation(summary ="图层新增",description = "图层新增") - @SaCheckPermission("business:layer:add") +// @SaCheckPermission("business:layer:add") @Log(title = "图层新增", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() @@ -65,7 +65,7 @@ public class BusinessLayerController extends BaseController { /** * 图层修改 */ - @SaCheckPermission("business:layer:edit") +// @SaCheckPermission("business:layer:edit") @Operation(summary ="图层修改",description = "图层修改") @Log(title = "图层修改", businessType = BusinessType.UPDATE) @RepeatSubmit() @@ -79,7 +79,7 @@ public class BusinessLayerController extends BaseController { * * @param id 主键 */ - @SaCheckPermission("business:task:remove") +// @SaCheckPermission("business:task:remove") @Operation(summary ="图层删除",description = "图层删除") @Log(title = "图层删除", businessType = BusinessType.DELETE) @GetMapping("/delete") diff --git a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessLayerVo.java b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessLayerVo.java index 7f9e46e..52460ff 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessLayerVo.java +++ b/dk-modules/business/src/main/java/org/dromara/business/domain/vo/BusinessLayerVo.java @@ -70,4 +70,7 @@ public class BusinessLayerVo { private List children; + //用于前端回显 + private List deptIdList; + } diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessLayerServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessLayerServiceImpl.java index f45c01a..3f91bb8 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessLayerServiceImpl.java +++ b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessLayerServiceImpl.java @@ -20,10 +20,7 @@ import org.dromara.system.api.domain.vo.RemoteDeptVo; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Slf4j @@ -33,7 +30,7 @@ public class BusinessLayerServiceImpl implements IBusinessLayerService { private final BusinessLayerMapper baseMapper; - @DubboReference + @DubboReference(timeout = 30000) RemoteDeptService remoteDeptService; @Override @@ -41,10 +38,16 @@ public class BusinessLayerServiceImpl implements IBusinessLayerService { Page result = baseMapper.queryPageList(pageQuery.build(), bo); result.getRecords().forEach(businessLayerVo -> { + List deptList = remoteDeptService.listTreeDeptByChild(businessLayerVo.getDeptId()); + LinkedList deptIdList = new LinkedList<>(); + deptList.forEach(deptVo -> { + deptIdList.add(deptVo.getDeptId()); + }); + List layerVoList = baseMapper.selectInfoByParent(businessLayerVo.getId()); businessLayerVo.setChildren(buildTree(layerVoList,businessLayerVo.getId())); - + businessLayerVo.setDeptIdList(deptIdList); }); return TableDataInfo.build(result); @@ -101,7 +104,7 @@ public class BusinessLayerServiceImpl implements IBusinessLayerService { * @param allNodes * @return */ - public static List buildTree(List allNodes, Long parentId) { + public List buildTree(List allNodes, Long parentId) { // 创建一个Map来存储所有节点,键为ID,值为节点 Map nodeMap = new HashMap<>(); for (BusinessLayerVo node : allNodes) { @@ -113,6 +116,14 @@ public class BusinessLayerServiceImpl implements IBusinessLayerService { // 遍历所有节点,将子节点添加到父节点的 children 列表中 for (BusinessLayerVo node : allNodes) { + List deptList = remoteDeptService.listTreeDeptByChild(node.getDeptId()); + LinkedList deptIdList = new LinkedList<>(); + deptList.forEach(deptVo -> { + deptIdList.add(deptVo.getDeptId()); + }); + + node.setDeptIdList(deptIdList); + if (node.getParentId().equals(parentId)) { rootNodes.add(node); // 当前节点的 parentId 与传入的 parentId 匹配,作为根节点 } else { diff --git a/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java index 524e362..c9f453c 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteDeptServiceImpl.java @@ -66,4 +66,11 @@ public class RemoteDeptServiceImpl implements RemoteDeptService { SysDeptVo sysDeptVo = sysDeptService.getByParentId(deptId); return BeanUtil.copyProperties(sysDeptVo, RemoteDeptVo.class); } + + @Override + public List listTreeDeptByChild(Long deptId) { + List deptVoList = sysDeptService.listTreeDeptByChild(deptId); + + return BeanUtil.copyToList(deptVoList, RemoteDeptVo.class); + } } diff --git a/dk-modules/system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java b/dk-modules/system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java index 019c1d4..a368ea3 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java +++ b/dk-modules/system/src/main/java/org/dromara/system/mapper/SysDeptMapper.java @@ -74,4 +74,6 @@ public interface SysDeptMapper extends BaseMapperPlus { List> getNamePathList(@Param("deptId") Long deptId); List listTreeDept(@Param("deptId") Long deptId, @Param("tbPrefix") ProjectTablePrefixConfig tbPrefix); + + List listTreeDeptByChild(@Param("deptId") Long deptId); } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/ISysDeptService.java b/dk-modules/system/src/main/java/org/dromara/system/service/ISysDeptService.java index 05a0a95..b259af1 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/ISysDeptService.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -160,4 +160,6 @@ public interface ISysDeptService { List listTreeDept(Long deptId); SysDept addBoundaryDept(SysDeptBo sysDeptBo); + + List listTreeDeptByChild(Long deptId); } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 9ee2afe..78e5813 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -407,4 +407,9 @@ public class SysDeptServiceImpl implements ISysDeptService { return dept; } + @Override + public List listTreeDeptByChild(Long deptId) { + return baseMapper.listTreeDeptByChild(deptId); //.getTableCloud() + } + } diff --git a/dk-modules/system/src/main/java/org/dromara/system/utils/KmzParserUtil.java b/dk-modules/system/src/main/java/org/dromara/system/utils/KmzParserUtil.java index b5237b4..e7af342 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/utils/KmzParserUtil.java +++ b/dk-modules/system/src/main/java/org/dromara/system/utils/KmzParserUtil.java @@ -1,5 +1,6 @@ package org.dromara.system.utils; +import cn.hutool.core.util.ObjectUtil; import org.dromara.system.domain.kmz.KmzResult; import org.dromara.system.domain.kmz.Placemark; @@ -121,7 +122,9 @@ public class KmzParserUtil { for (String coords : currentCoordinates) { Placemark newPlacemark = new Placemark(); newPlacemark.setName(currentPlacemark.getName()); - newPlacemark.setAttributes(new HashMap<>(currentPlacemark.getAttributes())); + if (ObjectUtil.isNotEmpty(currentPlacemark.getAttributes())){ + newPlacemark.setAttributes(new HashMap<>(currentPlacemark.getAttributes())); + } newPlacemark.setCoordinates(coords); placemarks.add(newPlacemark); } diff --git a/dk-modules/system/src/main/resources/mapper/system/SysDeptMapper.xml b/dk-modules/system/src/main/resources/mapper/system/SysDeptMapper.xml index d823dfc..bbb8d7c 100644 --- a/dk-modules/system/src/main/resources/mapper/system/SysDeptMapper.xml +++ b/dk-modules/system/src/main/resources/mapper/system/SysDeptMapper.xml @@ -112,4 +112,34 @@ )select * from warning_summary + + +