From 4dce850aea138627d00361968c57557e664f3a54 Mon Sep 17 00:00:00 2001 From: lin <648540858@qq.com> Date: Fri, 14 Mar 2025 14:53:47 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=8C=E6=94=BF=E5=8C=BA=E5=88=92=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=BC=82=E5=B8=B8=E6=95=B0=E6=8D=AE=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E8=A1=8C=E6=94=BF=E5=8C=BA=E5=88=92=E8=8A=82=E7=82=B9=E4=BB=A5?= =?UTF-8?q?=E5=8F=8A=E6=B8=85=E7=90=86=E5=BC=82=E5=B8=B8=E8=A1=8C=E6=94=BF?= =?UTF-8?q?=E5=8C=BA=E5=88=92=E8=8A=82=E7=82=B9=E4=BD=BF=E9=80=9A=E9=81=93?= =?UTF-8?q?=E5=8F=AF=E8=A2=AB=E6=8C=82=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../controller/CommonChannelController.java | 11 +-- .../gb28181/controller/RegionController.java | 16 ++++ .../gb28181/dao/CommonGBChannelMapper.java | 11 +++ .../iot/vmp/gb28181/dao/RegionMapper.java | 9 ++ .../gb28181/dao/provider/ChannelProvider.java | 9 ++ .../gb28181/service/IGbChannelService.java | 2 + .../vmp/gb28181/service/IRegionService.java | 4 + .../service/impl/GbChannelServiceImpl.java | 12 +++ .../service/impl/RegionServiceImpl.java | 62 ++++++++++++++ .../dialog/UnusualRegionChannelSelect.vue | 84 +++++++++++++++---- .../src/components/dialog/recordDownload.vue | 1 - 12 files changed, 200 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index c23715ef..5afd26d4 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ https://gitee.com/pan648540858/wvp-GB28181-pro.git # 功能特性 - [X] 集成web界面 - [X] 兼容性良好 +- [X] 跨平台服务,一次编译多端部署, 可以同时用于x86和arm架构 - [X] 接入设备 - [X] 视频预览 - [X] 支持主码流子码流切换 diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/CommonChannelController.java b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/CommonChannelController.java index ef81848f..55552d9f 100755 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/controller/CommonChannelController.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/controller/CommonChannelController.java @@ -161,13 +161,10 @@ public class CommonChannelController { } @Operation(summary = "清除存在行政区划但无法挂载的通道列表", security = @SecurityRequirement(name = JwtUtils.HEADER)) - @Parameter(name = "param", description = "当前页", required = true) - @GetMapping("/civilCode/unusual/clear") - public void queryListByCivilCodeForUnusual(ChannelToRegionParam param){ - if (ObjectUtils.isEmpty(query)){ - query = null; - } - return channelService.queryListByCivilCodeForUnusual(page, count, query, online, channelType); + @Parameter(name = "param", description = "清理参数, all为true清理所有异常数据。 否则按照传入的设备Id清理", required = true) + @PostMapping("/civilCode/unusual/clear") + public void clearChannelCivilCode(@RequestBody ChannelToRegionParam param){ + channelService.clearChannelCivilCode(param.getAll(), param.getChannelIds()); } @Operation(summary = "获取关联业务分组通道列表", security = @SecurityRequirement(name = JwtUtils.HEADER)) 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 3fd7f79a..d49c2862 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 @@ -124,4 +124,20 @@ public class RegionController { public void sync(){ regionService.syncFromChannel(); } + + @Operation(summary = "根据行政区划编号从文件中查询层级和描述") + @ResponseBody + @GetMapping("/description") + public String getDescription(String civilCode){ + return regionService.getDescription(civilCode); + } + + @Operation(summary = "根据行政区划编号从文件中查询层级并添加") + @ResponseBody + @GetMapping("/addByCivilCode") + public void addByCivilCode(String civilCode){ + regionService.addByCivilCode(civilCode); + } + + } 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 c9468a02..aad0c274 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 @@ -307,6 +307,14 @@ public interface CommonGBChannelMapper { " "}) int removeCivilCodeByChannels(List channelList); + @Update(value = {" "}) + int removeCivilCodeByChannelIds(List channelIdList); + @SelectProvider(type = ChannelProvider.class, method = "queryByCivilCode") List queryByCivilCode(@Param("civilCode") String civilCode); @@ -548,4 +556,7 @@ public interface CommonGBChannelMapper { @SelectProvider(type = ChannelProvider.class, method = "queryListByCivilCodeForUnusual") List queryListByCivilCodeForUnusual(@Param("query") String query, @Param("online") Boolean online, @Param("dataType")Integer dataType); + @SelectProvider(type = ChannelProvider.class, method = "queryAllForUnusual") + List queryAllForUnusual(); + } 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 f3114672..c9b9cfac 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 @@ -1,5 +1,6 @@ package com.genersoft.iot.vmp.gb28181.dao; +import com.genersoft.iot.vmp.common.CivilCodePo; import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel; import com.genersoft.iot.vmp.gb28181.bean.Region; import com.genersoft.iot.vmp.gb28181.bean.RegionTree; @@ -179,4 +180,12 @@ public interface RegionMapper { " ") Set queryNotShareRegionForPlatformByRegionList(Set allRegion, @Param("platformId") Integer platformId); + + @Select(" ") + Set queryInCivilCodePoList(List civilCodePoList); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java index b4d006d0..018e77b0 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/provider/ChannelProvider.java @@ -431,4 +431,13 @@ public class ChannelProvider { } return sqlBuild.toString(); } + + public String queryAllForUnusual(Map params ){ + StringBuilder sqlBuild = new StringBuilder(); + sqlBuild.append("select wdc.id from wvp_device_channel wdc "); + sqlBuild.append(" left join (select wcr.device_id from wvp_common_region wcr) temp on temp.device_id = coalesce(wdc.gb_civil_code, wdc.civil_code)" + + " where coalesce(wdc.gb_civil_code, wdc.civil_code) is not null and temp.device_id is null "); + sqlBuild.append(" AND wdc.channel_type = 0 "); + return sqlBuild.toString(); + } } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java index 399e1ff1..6550d8bb 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGbChannelService.java @@ -91,4 +91,6 @@ public interface IGbChannelService { void queryRecordInfo(CommonGBChannel channel, String startTime, String endTime, ErrorCallback callback); PageInfo queryListByCivilCodeForUnusual(int page, int count, String query, Boolean online, Integer channelType); + + void clearChannelCivilCode(Boolean all, List channelIds); } 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 0bd8700d..6a2b9296 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 @@ -36,4 +36,8 @@ public interface IRegionService { boolean batchAdd(List regionList); List getPath(String deviceId); + + String getDescription(String civilCode); + + void addByCivilCode(String civilCode); } diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java index a1c493ba..d4068d75 100644 --- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GbChannelServiceImpl.java @@ -762,4 +762,16 @@ public class GbChannelServiceImpl implements IGbChannelService { List all = commonGBChannelMapper.queryListByCivilCodeForUnusual(query, online, channelType); return new PageInfo<>(all); } + + @Override + public void clearChannelCivilCode(Boolean all, List channelIds) { + + List channelIdsForClear; + if (all != null && all) { + channelIdsForClear = commonGBChannelMapper.queryAllForUnusual(); + }else { + channelIdsForClear = channelIds; + } + commonGBChannelMapper.removeCivilCodeByChannelIds(channelIdsForClear); + } } 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 f40d8c42..b21832a7 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 @@ -262,4 +262,66 @@ public class RegionServiceImpl implements IRegionService { regionList.addAll(allParent); return regionList; } + + @Override + public String getDescription(String civilCode) { + + CivilCodePo civilCodePo = CivilCodeUtil.INSTANCE.getCivilCodePo(civilCode); + Assert.notNull(civilCodePo, String.format("节点%s未查询到", civilCode)); + StringBuilder sb = new StringBuilder(); + sb.append(civilCodePo.getName()); + List civilCodePoList = CivilCodeUtil.INSTANCE.getAllParentCode(civilCode); + if (civilCodePoList.isEmpty()) { + return sb.toString(); + } + for (int i = 0; i < civilCodePoList.size(); i++) { + CivilCodePo item = civilCodePoList.get(i); + sb.insert(0, item.getName()); + if (i != civilCodePoList.size() - 1) { + sb.insert(0, "/"); + } + } + return sb.toString(); + } + + @Override + @Transactional + public void addByCivilCode(String civilCode) { + CivilCodePo civilCodePo = CivilCodeUtil.INSTANCE.getCivilCodePo(civilCode); + // 查询是否已经存在此节点 + Assert.notNull(civilCodePo, String.format("节点%s未查询到", civilCode)); + List civilCodePoList = CivilCodeUtil.INSTANCE.getAllParentCode(civilCode); + civilCodePoList.add(civilCodePo); + + Set civilCodeSet = regionMapper.queryInCivilCodePoList(civilCodePoList); + if (!civilCodeSet.isEmpty()) { + civilCodePoList.removeIf(item -> civilCodeSet.contains(item.getCode())); + } + if (civilCodePoList.isEmpty()) { + return; + } + int parentId = -1; + for (int i = civilCodePoList.size() - 1; i > -1; i--) { + CivilCodePo codePo = civilCodePoList.get(i); + + Region region = new Region(); + region.setDeviceId(codePo.getCode()); + region.setParentDeviceId(codePo.getParentCode()); + region.setName(civilCodePo.getName()); + region.setCreateTime(DateUtil.getNow()); + region.setUpdateTime(DateUtil.getNow()); + if (parentId == -1 && codePo.getParentCode() != null) { + Region parentRegion = regionMapper.queryByDeviceId(codePo.getParentCode()); + if (parentRegion == null){ + log.error(String.format("行政区划%sy已存在,但查询错误", codePo.getParentCode())); + throw new ControllerException(ErrorCode.ERROR100.getCode(), String.format("行政区划%sy已存在,但查询错误", codePo.getParentCode())); + } + region.setParentId(parentRegion.getId()); + }else { + region.setParentId(parentId); + } + regionMapper.add(region); + parentId = region.getId(); + } + } } diff --git a/web_src/src/components/dialog/UnusualRegionChannelSelect.vue b/web_src/src/components/dialog/UnusualRegionChannelSelect.vue index bb59a35a..251cf037 100644 --- a/web_src/src/components/dialog/UnusualRegionChannelSelect.vue +++ b/web_src/src/components/dialog/UnusualRegionChannelSelect.vue @@ -33,7 +33,7 @@ 清除 全部清除 + @click="clearUnusualRegion(true)">全部清除 刷新 @@ -75,6 +75,7 @@ size="medium" type="text" icon="el-icon-plus" + :loading="scope.row.addRegionLoading" @click="addRegion(scope.row)" > 添加 @@ -154,6 +155,9 @@ export default { }).then( (res)=> { if (res.data.code === 0) { this.total = res.data.data.total; + for (let i = 0; i < res.data.data.list.length; i++) { + res.data.data.list[i]["addRegionLoading"] = false + } this.channelList = res.data.data.list; } }).catch( (error)=> { @@ -170,27 +174,26 @@ export default { close: function () { this.showDialog = false; }, - clearUnusualRegion: function () { - if (this.multipleSelection.length === 0) { - return; + clearUnusualRegion: function (all) { + let channels = null + if (all || this.multipleSelection.length > 0 ) { + channels = [] + for (let i = 0; i < this.multipleSelection.length; i++) { + channels.push(this.multipleSelection[i].gbId) + } } - let channels = [] - for (let i = 0; i < this.multipleSelection.length; i++) { - channels.push(this.multipleSelection[i].gbId) - } - this.$axios({ method: 'post', - url: `/api/common/channel/region/add`, + url: `/api/common/channel/civilCode/unusual/clear`, data: { - civilCode: regionDeviceId, + all: all, channelIds: channels } }).then((res) => { if (res.data.code === 0) { this.$message.success({ showClose: true, - message: "保存成功" + message: "清除成功" }) this.getChannelList() } else { @@ -199,18 +202,71 @@ export default { message: res.data.msg }) } - this.loading = false }).catch((error) => { this.$message.error({ showClose: true, message: error }) + }).finally(()=>{ this.loading = false - }); + }) }, addRegion: function (row) { + row.addRegionLoading = true; + this.$axios({ + method: 'get', + url: `/api/region/description`, + params: { + civilCode: row.gbCivilCode, + } + }).then((res) => { + if (res.data.code === 0) { + this.$confirm(`确定添加: ${res.data.data}`, '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'info' + }).then(() => { + this.$axios({ + method: 'get', + url: `/api/region/addByCivilCode`, + params: { + civilCode: row.gbCivilCode, + } + }).then((res) => { + if (res.data.code === 0) { + this.$message.success({ + showClose: true, + message: "添加成功" + }) + this.initData() + }else { + this.$message.error({ + showClose: true, + message: res.data.msg + }) + } + }).catch((error) => { + console.error(error); + }); + }).catch(() => { + + }); + } else { + this.$message.error({ + showClose: true, + message: res.data.msg + }) + } + }).catch((error) => { + this.$message.error({ + showClose: true, + message: error + }) + }).finally(()=>{ + row.addRegionLoading = false; + }) }, } diff --git a/web_src/src/components/dialog/recordDownload.vue b/web_src/src/components/dialog/recordDownload.vue index 170807f0..7b6ab1b7 100755 --- a/web_src/src/components/dialog/recordDownload.vue +++ b/web_src/src/components/dialog/recordDownload.vue @@ -40,7 +40,6 @@ export default { getProgressRun: false, timer: null, downloadFile: null, - }; }, methods: {