From 5a812e7f083872f0b34020cd7ec0cff47940f8b8 Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: Wed, 24 Jul 2024 17:54:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../genersoft/iot/vmp/common/CivilCodePo.java | 6 +- .../iot/vmp/conf/CivilCodeFileConf.java | 28 +- .../iot/vmp/gb28181/bean/Region.java | 13 + .../gb28181/controller/RegionController.java | 27 +- .../gb28181/dao/CommonGBChannelMapper.java | 2 +- .../iot/vmp/gb28181/dao/RegionMapper.java | 42 ++- .../vmp/gb28181/service/IRegionService.java | 4 + .../service/impl/RegionServiceImpl.java | 55 +++- .../iot/vmp/utils/CivilCodeUtil.java | 51 +++ web_src/package.json | 1 + web_src/src/components/common/RegionTree.vue | 303 ++++++++---------- web_src/src/components/region.vue | 23 +- 12 files changed, 355 insertions(+), 200 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/common/CivilCodePo.java b/src/main/java/com/genersoft/iot/vmp/common/CivilCodePo.java index 452c12efe..38851977b 100644 --- a/src/main/java/com/genersoft/iot/vmp/common/CivilCodePo.java +++ b/src/main/java/com/genersoft/iot/vmp/common/CivilCodePo.java @@ -1,5 +1,7 @@ package com.genersoft.iot.vmp.common; +import org.springframework.util.ObjectUtils; + public class CivilCodePo { private String code; @@ -12,7 +14,9 @@ public class CivilCodePo { CivilCodePo civilCodePo = new CivilCodePo(); civilCodePo.setCode(infoArray[0]); civilCodePo.setName(infoArray[1]); - civilCodePo.setParentCode(infoArray[2]); + if (!ObjectUtils.isEmpty(infoArray[2])) { + civilCodePo.setParentCode(infoArray[2]); + } return civilCodePo; } diff --git a/src/main/java/com/genersoft/iot/vmp/conf/CivilCodeFileConf.java b/src/main/java/com/genersoft/iot/vmp/conf/CivilCodeFileConf.java index 8b4c95272..878e01c5d 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/CivilCodeFileConf.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/CivilCodeFileConf.java @@ -1,9 +1,8 @@ package com.genersoft.iot.vmp.conf; import com.genersoft.iot.vmp.common.CivilCodePo; -import com.genersoft.iot.vmp.gb28181.bean.Region; +import com.genersoft.iot.vmp.utils.CivilCodeUtil; import lombok.extern.slf4j.Slf4j; -import org.ehcache.impl.internal.concurrent.ConcurrentHashMap; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.context.annotation.Configuration; @@ -17,9 +16,6 @@ import java.io.File; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.file.Files; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; /** * 启动时读取行政区划表 @@ -33,8 +29,6 @@ public class CivilCodeFileConf implements CommandLineRunner { @Lazy private UserSetting userSetting; - private final Map civilCodeMap= new ConcurrentHashMap<>(); - @Override public void run(String... args) throws Exception { if (ObjectUtils.isEmpty(userSetting.getCivilCodeFile())) { @@ -70,28 +64,14 @@ public class CivilCodeFileConf implements CommandLineRunner { } String[] infoArray = line.split(","); CivilCodePo civilCodePo = CivilCodePo.getInstance(infoArray); - civilCodeMap.put(civilCodePo.getCode(), civilCodePo); + CivilCodeUtil.INSTANCE.add(civilCodePo); } inputStreamReader.close(); inputStream.close(); - if (civilCodeMap.isEmpty()) { + if (CivilCodeUtil.INSTANCE.isEmpty()) { log.warn("[行政区划] 文件内容为空,可能造成目录刷新结果不完整"); }else { - log.info("[行政区划] 加载成功,共加载数据{}条", civilCodeMap.size()); + log.info("[行政区划] 加载成功,共加载数据{}条", CivilCodeUtil.INSTANCE.size()); } } - - public List getAllChild(String parent) { - List result = new ArrayList<>(); - for (String key : civilCodeMap.keySet()) { - if (parent == null) { - if (ObjectUtils.isEmpty(civilCodeMap.get(key).getParentCode().trim())) { - result.add(Region.getInstance(key, civilCodeMap.get(key).getName(), civilCodeMap.get(key).getParentCode())); - } - }else if (civilCodeMap.get(key).getParentCode().equals(parent)) { - result.add(Region.getInstance(key, civilCodeMap.get(key).getName(), civilCodeMap.get(key).getParentCode())); - } - } - return result; - } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Region.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Region.java index 60c860084..cabba0af1 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Region.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/Region.java @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.gb28181.bean; +import com.genersoft.iot.vmp.common.CivilCodePo; import com.genersoft.iot.vmp.utils.DateUtil; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -57,6 +58,18 @@ public class Region implements Comparable{ return region; } + public static Region getInstance(CivilCodePo civilCodePo) { + Region region = new Region(); + region.setName(civilCodePo.getName()); + region.setDeviceId(civilCodePo.getCode()); + if (civilCodePo.getCode().length() > 2) { + region.setParentDeviceId(civilCodePo.getParentCode()); + } + region.setCreateTime(DateUtil.getNow()); + region.setUpdateTime(DateUtil.getNow()); + return region; + } + @Override public int compareTo(@NotNull Region region) { return Integer.compare(Integer.parseInt(this.deviceId), Integer.parseInt(region.getDeviceId())); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java index 4445c51e1..913dad354 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/RegionController.java @@ -39,7 +39,7 @@ public class RegionController { @Parameter(name = "page", description = "当前页", required = true) @Parameter(name = "count", description = "每页查询数量", required = true) @ResponseBody - @GetMapping("/list") + @GetMapping("/page/list") public PageInfo query( @RequestParam(required = false) String query, @RequestParam(required = true) int page, @@ -48,6 +48,24 @@ public class RegionController { return regionService.query(query, page, count); } + @Operation(summary = "查询区域") + @Parameter(name = "query", description = "要搜索的内容", required = true) + @Parameter(name = "parent", description = "所属行政区划编号", required = true) + @ResponseBody + @GetMapping("/tree/list") + public List queryForTree( + @RequestParam(required = false) String query, + @RequestParam(required = false) String parent + ){ + if (ObjectUtils.isEmpty(parent)) { + parent = null; + } + if (ObjectUtils.isEmpty(query)) { + query = null; + } + return regionService.queryForTree(query, parent); + } + @Operation(summary = "更新区域") @Parameter(name = "region", description = "Region", required = true) @ResponseBody @@ -108,4 +126,11 @@ public class RegionController { } return regionService.getAllChild(parent); } + + @Operation(summary = "从通道中同步行政区划") + @ResponseBody + @GetMapping("/sync") + public void sync(){ + regionService.syncFromChannel(); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java index cd9ff92e2..aeafd81f4 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/CommonGBChannelMapper.java @@ -140,7 +140,7 @@ public interface CommonGBChannelMapper { ", gb_download_speed = #{gbDownloadSpeed}" + ", gb_svc_space_support_mod = #{gbSvcSpaceSupportMod}" + ", gb_svc_time_support_mode = #{gbSvcTimeSupportMode}" + - "WHERE id = #{gbId}"+ + " WHERE id = #{gbId}"+ " "}) int update(CommonGBChannel commonGBChannel); diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java index 71f56db3f..3fe80eef7 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/RegionMapper.java @@ -4,6 +4,7 @@ import com.genersoft.iot.vmp.gb28181.bean.Region; import org.apache.ibatis.annotations.*; import java.util.List; +import java.util.Set; @Mapper public interface RegionMapper { @@ -30,8 +31,45 @@ public interface RegionMapper { List query(@Param("query") String query, @Param("parentId") String parentId); @Select("SELECT * from wvp_common_region WHERE parent_device_id = #{parentId} ORDER BY id ") - List getChildren(String parentId); + List getChildren(@Param("parentId") String parentId); @Select("SELECT * from wvp_common_region WHERE id = #{id} ") - Region queryOne(int id); + Region queryOne(@Param("id") int id); + + @Select(" select coalesce(dc.gb_civil_code, dc.civil_code) as civil_code " + + " from wvp_device_channel dc " + + " where coalesce(dc.gb_civil_code, dc.civil_code) not in " + + " (select device_id from wvp_common_region)") + List getUninitializedCivilCode(); + + @Select(" ") + List queryInList(Set codes); + + + @Insert(" ") + int batchAdd(List regionList); + + @Select(" ") + List queryForTree(@Param("query") String query, @Param("parentId") String parentId); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IRegionService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IRegionService.java index 01c0d05d4..22c46333c 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IRegionService.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IRegionService.java @@ -30,4 +30,8 @@ public interface IRegionService { List getAllChild(String parent); Region queryRegionByDeviceId(String regionDeviceId); + + List queryForTree(String query, String parent); + + void syncFromChannel(); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/RegionServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/RegionServiceImpl.java index 844847e97..e360e78fe 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/RegionServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/RegionServiceImpl.java @@ -1,9 +1,11 @@ package com.genersoft.iot.vmp.gb28181.service.impl; +import com.genersoft.iot.vmp.common.CivilCodePo; import com.genersoft.iot.vmp.conf.CivilCodeFileConf; import com.genersoft.iot.vmp.gb28181.bean.Region; import com.genersoft.iot.vmp.gb28181.dao.RegionMapper; import com.genersoft.iot.vmp.gb28181.service.IRegionService; +import com.genersoft.iot.vmp.utils.CivilCodeUtil; import com.genersoft.iot.vmp.utils.DateUtil; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; @@ -12,8 +14,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; -import java.util.Collections; -import java.util.List; +import java.util.*; /** * 区域管理类 @@ -75,7 +76,7 @@ public class RegionServiceImpl implements IRegionService { @Override public List getAllChild(String parent) { - List allChild = civilCodeFileConf.getAllChild(parent); + List allChild = CivilCodeUtil.INSTANCE.getAllChild(parent); Collections.sort(allChild); return allChild; } @@ -84,4 +85,52 @@ public class RegionServiceImpl implements IRegionService { public Region queryRegionByDeviceId(String regionDeviceId) { return null; } + + @Override + public List queryForTree(String query, String parent) { + return regionMapper.queryForTree(query, parent); + } + + @Override + public void syncFromChannel() { + // 获取未初始化的行政区划节点 + List civilCodeList = regionMapper.getUninitializedCivilCode(); + if (civilCodeList.isEmpty()) { + return; + } + List regionList = new ArrayList<>(); + // 收集节点的父节点,用于验证哪些节点的父节点不存在,方便一并存入 + Map regionMapForVerification = new HashMap<>(); + civilCodeList.forEach(civilCode->{ + CivilCodePo civilCodePo = CivilCodeUtil.INSTANCE.getCivilCodePo(civilCode); + if (civilCodePo != null) { + Region region = Region.getInstance(civilCodePo); + regionList.add(region); + // 获取全部的父节点 + List civilCodePoList = CivilCodeUtil.INSTANCE.getAllParentCode(civilCode); + if (!civilCodePoList.isEmpty()) { + for (CivilCodePo codePo : civilCodePoList) { + regionMapForVerification.put(codePo.getCode(), Region.getInstance(codePo)); + } + } + } + }); + if (regionList.isEmpty()){ + return; + } + if (!regionMapForVerification.isEmpty()) { + // 查询数据库中已经存在的. + List civilCodesInDb = regionMapper.queryInList(regionMapForVerification.keySet()); + if (!civilCodesInDb.isEmpty()) { + for (String code : civilCodesInDb) { + regionMapForVerification.remove(code); + } + } + } + for (Region region : regionList) { + regionMapForVerification.put(region.getDeviceId(), region); + } + + regionMapper.batchAdd(new ArrayList<>(regionMapForVerification.values())); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/utils/CivilCodeUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/CivilCodeUtil.java index 98c3c9a49..06f5910fd 100644 --- a/src/main/java/com/genersoft/iot/vmp/utils/CivilCodeUtil.java +++ b/src/main/java/com/genersoft/iot/vmp/utils/CivilCodeUtil.java @@ -1,8 +1,11 @@ package com.genersoft.iot.vmp.utils; import com.genersoft.iot.vmp.common.CivilCodePo; +import com.genersoft.iot.vmp.gb28181.bean.Region; import lombok.extern.slf4j.Slf4j; +import org.springframework.util.ObjectUtils; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -25,6 +28,10 @@ public enum CivilCodeUtil { } } + public void add(CivilCodePo civilCodePo) { + civilCodeMap.put(civilCodePo.getCode(), civilCodePo); + } + public CivilCodePo getParentCode(String code) { if (code.length() > 8) { return null; @@ -43,6 +50,50 @@ public enum CivilCodeUtil { } return civilCodeMap.get(parentCode); } + } + public CivilCodePo getCivilCodePo(String code) { + if (code.length() > 8) { + return null; + }else { + return civilCodeMap.get(code); + } + } + + public List getAllParentCode(String civilCode) { + List civilCodePoList = new ArrayList<>(); + CivilCodePo parentCode = getParentCode(civilCode); + if (parentCode != null) { + civilCodePoList.add(parentCode); + List allParentCode = getAllParentCode(parentCode.getCode()); + if (!allParentCode.isEmpty()) { + civilCodePoList.addAll(allParentCode); + }else { + return civilCodePoList; + } + } + return civilCodePoList; + } + + public boolean isEmpty() { + return civilCodeMap.isEmpty(); + } + + public int size() { + return civilCodeMap.size(); + } + + public List getAllChild(String parent) { + List result = new ArrayList<>(); + for (String key : civilCodeMap.keySet()) { + if (parent == null) { + if (ObjectUtils.isEmpty(civilCodeMap.get(key).getParentCode().trim())) { + result.add(Region.getInstance(key, civilCodeMap.get(key).getName(), civilCodeMap.get(key).getParentCode())); + } + }else if (civilCodeMap.get(key).getParentCode().equals(parent)) { + result.add(Region.getInstance(key, civilCodeMap.get(key).getName(), civilCodeMap.get(key).getParentCode())); + } + } + return result; } } diff --git a/web_src/package.json b/web_src/package.json index 9ec4cfd65..72b22c789 100644 --- a/web_src/package.json +++ b/web_src/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@liveqing/liveplayer": "^2.7.10", + "@wchbrad/vue-easy-tree": "^1.0.12", "axios": "^0.24.0", "core-js": "^2.6.5", "echarts": "^4.9.0", diff --git a/web_src/src/components/common/RegionTree.vue b/web_src/src/components/common/RegionTree.vue index 87eab7658..538a20d03 100755 --- a/web_src/src/components/common/RegionTree.vue +++ b/web_src/src/components/common/RegionTree.vue @@ -1,191 +1,162 @@ diff --git a/web_src/src/components/region.vue b/web_src/src/components/region.vue index 9e000f316..b84df50b3 100755 --- a/web_src/src/components/region.vue +++ b/web_src/src/components/region.vue @@ -1,10 +1,29 @@