From bdf7ae57710414767090e92a03bd92e1d410dfb1 Mon Sep 17 00:00:00 2001
From: lin <648540858@qq.com>
Date: Thu, 9 Oct 2025 15:55:13 +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
---
pom.xml | 4 +-
.../iot/vmp/conf/SpringDocConfig.java | 8 +
.../iot/vmp/gb28181/bean/CommonGBChannel.java | 2 +-
.../gb28181/dao/CommonGBChannelMapper.java | 12 +-
.../iot/vmp/gb28181/dao/GroupMapper.java | 7 +-
.../gb28181/dao/provider/ChannelProvider.java | 102 ++++++++-----
.../vmp/gb28181/service/IGroupService.java | 2 +
.../service/impl/GroupServiceImpl.java | 3 +-
.../web/custom/CameraChannelController.java | 57 ++-----
.../vmp/web/custom/bean/CameraChannel.java | 5 +
.../iot/vmp/web/custom/bean/CameraGroup.java | 31 ++++
.../custom/service/CameraChannelService.java | 144 ++++++++++++++----
12 files changed, 266 insertions(+), 111 deletions(-)
create mode 100644 src/main/java/com/genersoft/iot/vmp/web/custom/bean/CameraGroup.java
diff --git a/pom.xml b/pom.xml
index ade82e5e3..60a9f8333 100644
--- a/pom.xml
+++ b/pom.xml
@@ -209,12 +209,12 @@
org.springdoc
springdoc-openapi-starter-webmvc-ui
- 2.8.8
+ 2.8.13
org.springdoc
springdoc-openapi-starter-webmvc-api
- 2.8.8
+ 2.8.13
org.springdoc
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java
index 245aba36f..65ebc3f88 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/SpringDocConfig.java
@@ -106,4 +106,12 @@ public class SpringDocConfig {
.packagesToScan("com.genersoft.iot.vmp.jt1078.controller")
.build();
}
+
+ @Bean
+ public GroupedOpenApi publicApi99() {
+ return GroupedOpenApi.builder()
+ .group("99. 第三方接口")
+ .packagesToScan("com.genersoft.iot.vmp.web.custom")
+ .build();
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonGBChannel.java b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonGBChannel.java
index 654c763f1..2e43e5b3b 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonGBChannel.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/bean/CommonGBChannel.java
@@ -101,7 +101,7 @@ public class CommonGBChannel {
@Schema(description = "国标-虚拟组织所属的业务分组ID")
private String gbBusinessGroupId;
- @Schema(description = "国标-摄像机结构类型,标识摄像机类型: 1-球机; 2-半球; 3-固定枪机; 4-遥控枪机;5-遥控半球;6-多目设备的全景/拼接通道;7-多目设备的分割通道")
+ @Schema(description = "国标-摄像机结构类型,标识摄像机类型: 1-球机; 2-半球; 3-固定枪机; 4-遥控枪机;5-遥控半球;6-多目设备的全景/拼接通道;7-多目设备的分割通道; 99-移动设备(非标)")
private Integer gbPtzType;
// 2016
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 d65b7e539..59c5b712e 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
@@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.gb28181.dao.provider.ChannelProvider;
import com.genersoft.iot.vmp.service.bean.GPSMsgInfo;
import com.genersoft.iot.vmp.streamPush.bean.StreamPush;
import com.genersoft.iot.vmp.web.custom.bean.CameraChannel;
+import com.genersoft.iot.vmp.web.custom.bean.CameraGroup;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
@@ -607,10 +608,15 @@ public interface CommonGBChannelMapper {
@SelectProvider(type = ChannelProvider.class, method = "queryListForSy")
- List queryListForSy(@Param("query") String query, @Param("sortName") String sortName, @Param("order") String order,
- @Param("groupDeviceId") String groupDeviceId, @Param("online") Boolean online, @Param("containMobileDevice") Boolean containMobileDevice);
+ List queryListForSy(@Param("groupDeviceId") String groupDeviceId, @Param("online") Boolean online);
@SelectProvider(type = ChannelProvider.class, method = "queryGbChannelByChannelDeviceIdAndGbDeviceId")
- CommonGBChannel queryGbChannelByChannelDeviceIdAndGbDeviceId(String deviceId, String deviceCode);
+ CommonGBChannel queryGbChannelByChannelDeviceIdAndGbDeviceId(@Param("channelDeviceId") String channelDeviceId, @Param("gbDeviceId") String gbDeviceId);
+
+ @SelectProvider(type = ChannelProvider.class, method = "queryListByDeviceIds")
+ List queryListByDeviceIds(List deviceIds);
+
+ @SelectProvider(type = ChannelProvider.class, method = "queryListWithChildForSy")
+ List queryListWithChildForSy(@Param("query") String query, @Param("sortName") String sortName, @Param("order") String order, @Param("groupList") List groupList, @Param("status") Boolean status);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java
index f09e50733..28cd52829 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/dao/GroupMapper.java
@@ -4,9 +4,11 @@ import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
import com.genersoft.iot.vmp.gb28181.bean.Group;
import com.genersoft.iot.vmp.gb28181.bean.GroupTree;
import com.genersoft.iot.vmp.gb28181.bean.Platform;
+import com.genersoft.iot.vmp.web.custom.bean.CameraGroup;
import org.apache.ibatis.annotations.*;
import java.util.List;
+import java.util.Map;
import java.util.Set;
@Mapper
@@ -120,6 +122,9 @@ public interface GroupMapper {
@Select("SELECT * from wvp_common_group WHERE business_group = #{businessGroup} ")
List queryByBusinessGroup(@Param("businessGroup") String businessGroup);
+ @Select("SELECT * from wvp_common_group WHERE business_group = #{businessGroup} ")
+ Map queryByBusinessGroupForMap(@Param("businessGroup") String businessGroup);
+
@Delete("DELETE FROM wvp_common_group WHERE business_group = #{businessGroup}")
int deleteByBusinessGroup(@Param("businessGroup") String businessGroup);
@@ -291,7 +296,7 @@ public interface GroupMapper {
void deletePlatformGroup(@Param("groupId") int groupId);
@Select("SELECT * from wvp_common_group WHERE alias = #{alias} ")
- Group queryGroupByAlias(@Param("alias") String alias);
+ CameraGroup queryGroupByAlias(@Param("alias") String alias);
@Select("SELECT * from wvp_common_group WHERE alias = #{alias} and business_group = #{businessGroup}")
Group queryGroupByAliasAndBusinessGroup(@Param("alias") String alias, @Param("deviceId") String businessGroup);
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 374e51035..cd38670de 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
@@ -3,6 +3,7 @@ package com.genersoft.iot.vmp.gb28181.dao.provider;
import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
import com.genersoft.iot.vmp.gb28181.bean.Group;
import com.genersoft.iot.vmp.streamPush.bean.StreamPush;
+import com.genersoft.iot.vmp.web.custom.bean.CameraGroup;
import java.util.Collection;
import java.util.List;
@@ -194,7 +195,7 @@ public class ChannelProvider {
" coalesce(wdc.gb_svc_space_support_mod, wdc.svc_space_support_mod) as gb_svc_space_support_mod,\n" +
" coalesce(wdc.gb_svc_time_support_mode, wdc.svc_time_support_mode) as gb_svc_time_support_mode\n" +
" from wvp_device_channel wdc\n" +
- " left join wvp_device wd on wdc.data_type = 1 wd.id = wdc.data_device_id"
+ " left join wvp_device wd on wdc.data_type = 1 AND wd.id = wdc.data_device_id"
;
public String queryByDeviceId(Map params ){
@@ -536,55 +537,88 @@ public class ChannelProvider {
public String queryListForSy(Map params ){
StringBuilder sqlBuild = new StringBuilder();
- sqlBuild.append(BASE_SQL);
- sqlBuild.append(" where channel_type = 0 ");
- if (params.get("query") != null) {
- sqlBuild.append(" AND (coalesce(gb_device_id, device_id) LIKE concat('%',#{query},'%') escape '/'" +
- " OR coalesce(gb_name, name) LIKE concat('%',#{query},'%') escape '/' )")
- ;
- }
+ sqlBuild.append(BASE_SQL_FOR_CAMERA_DEVICE);
+ sqlBuild.append(" where wdc.channel_type = 0 AND (wdc.gb_ptz_type is null || wdc.gb_ptz_type != 99) AND coalesce(gb_parent_id, parent_id) = #{groupDeviceId}");
if (params.get("online") != null && (Boolean)params.get("online")) {
sqlBuild.append(" AND coalesce(gb_status, status) = 'ON'");
}
if (params.get("online") != null && !(Boolean)params.get("online")) {
sqlBuild.append(" AND coalesce(gb_status, status) = 'OFF'");
}
- if (params.get("containMobileDevice") != null && !(Boolean)params.get("containMobileDevice")) {
- sqlBuild.append(" AND gb_ptz_type != 99");
+
+ return sqlBuild.toString();
+ }
+
+ public String queryListWithChildForSy(Map params ){
+ StringBuilder sqlBuild = new StringBuilder();
+ sqlBuild.append(BASE_SQL_FOR_CAMERA_DEVICE);
+ sqlBuild.append(" where wdc.channel_type = 0 AND (wdc.gb_ptz_type is null || wdc.gb_ptz_type != 99) " +
+ "AND coalesce(gb_parent_id, parent_id) = #{groupDeviceId} " +
+ "AND coalesce(gb_parent_id, parent_id) in (");
+
+ sqlBuild.append(" ");
+ List groupList = (List)params.get("groupList");
+ boolean first = true;
+ for (CameraGroup group : groupList) {
+ if (!first) {
+ sqlBuild.append(",");
+ }
+ sqlBuild.append(group.getId());
+ first = false;
}
- if (params.get("groupDeviceId") != null) {
- sqlBuild.append(" AND coalesce(gb_parent_id, parent_id) = #{groupDeviceId}");
- }else {
- sqlBuild.append(" AND coalesce(gb_parent_id, parent_id) is null");
+ sqlBuild.append(" )");
+
+ if (params.get("query") != null) {
+ sqlBuild.append(" AND (coalesce(wdc.gb_device_id, wdc.device_id) LIKE concat('%',#{query},'%') escape '/'" +
+ " OR coalesce(wdc.gb_name, wdc.name) LIKE concat('%',#{query},'%') escape '/' )")
+ ;
}
+ if (params.get("online") != null && (Boolean)params.get("online")) {
+ sqlBuild.append(" AND coalesce(gb_status, status) = 'ON'");
+ }
+ if (params.get("online") != null && !(Boolean)params.get("online")) {
+ sqlBuild.append(" AND coalesce(gb_status, status) = 'OFF'");
+ }
+
+
+ if (params.get("sortName") != null) {
+ if (params.get("order") == null) {
+ sqlBuild.append(" order by #{sortName} ");
+ }else {
+ sqlBuild.append(" order by #{sortName} #{order}");
+ }
+
+ }
return sqlBuild.toString();
}
public String queryGbChannelByChannelDeviceIdAndGbDeviceId(Map params ){
StringBuilder sqlBuild = new StringBuilder();
sqlBuild.append(BASE_SQL_FOR_CAMERA_DEVICE);
- sqlBuild.append(" where channel_type = 0 ");
- if (params.get("query") != null) {
- sqlBuild.append(" AND (coalesce(gb_device_id, device_id) LIKE concat('%',#{query},'%') escape '/'" +
- " OR coalesce(gb_name, name) LIKE concat('%',#{query},'%') escape '/' )")
- ;
+ sqlBuild.append(" where coalesce(wdc.gb_device_id, wdc.device_id) = #{channelDeviceId}");
+ if (params.get("gbDeviceId") != null) {
+ sqlBuild.append(" AND wdc.data_type = 1 and wd.device_id = #{gbDeviceId}");
}
- if (params.get("online") != null && (Boolean)params.get("online")) {
- sqlBuild.append(" AND coalesce(gb_status, status) = 'ON'");
- }
- if (params.get("online") != null && !(Boolean)params.get("online")) {
- sqlBuild.append(" AND coalesce(gb_status, status) = 'OFF'");
- }
- if (params.get("containMobileDevice") != null && !(Boolean)params.get("containMobileDevice")) {
- sqlBuild.append(" AND gb_ptz_type != 99");
- }
- if (params.get("groupDeviceId") != null) {
- sqlBuild.append(" AND coalesce(gb_parent_id, parent_id) = #{groupDeviceId}");
- }else {
- sqlBuild.append(" AND coalesce(gb_parent_id, parent_id) is null");
- }
-
return sqlBuild.toString();
}
+
+
+ public String queryListByDeviceIds(Map params ){
+ StringBuilder sqlBuild = new StringBuilder();
+ sqlBuild.append(BASE_SQL_FOR_CAMERA_DEVICE);
+ sqlBuild.append(" where coalesce(wdc.gb_device_id, wdc.device_id) in");
+
+ List deviceIds = (List)params.get("deviceIds");
+ boolean first = true;
+ for (String deviceId : deviceIds) {
+ if (!first) {
+ sqlBuild.append(",");
+ }
+ sqlBuild.append(deviceId);
+ first = false;
+ }
+ sqlBuild.append(" )");
+ return sqlBuild.toString() ;
+ }
}
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGroupService.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGroupService.java
index 3d99e1ed4..c22caee1e 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGroupService.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/IGroupService.java
@@ -11,6 +11,8 @@ public interface IGroupService {
void add(Group group);
+ List queryAllChildren(Integer id);
+
void update(Group group);
Group queryGroupByDeviceId(String regionDeviceId);
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GroupServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GroupServiceImpl.java
index 5c9f13f4b..6135b0c10 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GroupServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/service/impl/GroupServiceImpl.java
@@ -90,7 +90,8 @@ public class GroupServiceImpl implements IGroupService {
groupManager.addBusinessGroup(group);
}
- private List queryAllChildren(Integer id) {
+ @Override
+ public List queryAllChildren(Integer id) {
List children = groupManager.getChildren(id);
if (ObjectUtils.isEmpty(children)) {
return children;
diff --git a/src/main/java/com/genersoft/iot/vmp/web/custom/CameraChannelController.java b/src/main/java/com/genersoft/iot/vmp/web/custom/CameraChannelController.java
index 9ee82ca2a..a43f5708e 100644
--- a/src/main/java/com/genersoft/iot/vmp/web/custom/CameraChannelController.java
+++ b/src/main/java/com/genersoft/iot/vmp/web/custom/CameraChannelController.java
@@ -2,18 +2,13 @@ package com.genersoft.iot.vmp.web.custom;
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.conf.UserSetting;
-import com.genersoft.iot.vmp.conf.exception.ControllerException;
import com.genersoft.iot.vmp.conf.security.JwtUtils;
-import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
-import com.genersoft.iot.vmp.gb28181.bean.FrontEndControlCodeForPTZ;
import com.genersoft.iot.vmp.service.bean.ErrorCallback;
import com.genersoft.iot.vmp.service.bean.InviteErrorCode;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
-import com.genersoft.iot.vmp.vmanager.bean.StreamContent;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import com.genersoft.iot.vmp.web.custom.bean.CameraChannel;
import com.genersoft.iot.vmp.web.custom.bean.CameraStreamContent;
-import com.genersoft.iot.vmp.web.custom.bean.IdsQueryParam;
import com.genersoft.iot.vmp.web.custom.bean.PolygonQueryParam;
import com.genersoft.iot.vmp.web.custom.service.CameraChannelService;
import com.github.pagehelper.PageInfo;
@@ -24,7 +19,6 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.async.DeferredResult;
@@ -51,35 +45,17 @@ public class CameraChannelController {
@Operation(summary = "查询摄像机列表, 只查询当前虚拟组织下的", security = @SecurityRequirement(name = JwtUtils.HEADER))
@Parameter(name = "page", description = "当前页")
@Parameter(name = "count", description = "每页查询数量")
- @Parameter(name = "query", description = "查询内容")
- @Parameter(name = "sortName", description = "排序字段名")
- @Parameter(name = "order", description = "排序方式(升序 asc 或降序 desc )")
@Parameter(name = "groupAlias", description = "分组别名")
@Parameter(name = "geoCoordSys", description = "坐标系类型:WGS84,GCJ02、BD09")
@Parameter(name = "status", description = "摄像头状态")
- @Parameter(name = "containMobileDevice", description = "是否包含移动设备")
- public PageInfo queryListInCurrentGroup(@RequestParam(required = false, value = "page", defaultValue = "1" )Integer page,
- @RequestParam(required = false, value = "page", defaultValue = "100")Integer count,
- @RequestParam(required = false) String query,
- @RequestParam(required = false) String sortName,
- @RequestParam(required = false) String order,
- @RequestParam(required = true) String groupAlias,
- @RequestParam(required = false) Boolean status,
- @RequestParam(required = false) Boolean containMobileDevice){
- if (ObjectUtils.isEmpty(query)) {
- query = null;
- }
- if (ObjectUtils.isEmpty(sortName)) {
- sortName = null;
- }
- if (ObjectUtils.isEmpty(order)) {
- order = null;
- }
- if (ObjectUtils.isEmpty(groupAlias)) {
- groupAlias = null;
- }
+ public PageInfo queryList(@RequestParam(required = false, value = "page", defaultValue = "1" )Integer page,
+ @RequestParam(required = false, value = "count", defaultValue = "100")Integer count,
+ String groupAlias,
+ @RequestParam(required = false) String geoCoordSys,
+ @RequestParam(required = false) Boolean status){
- return channelService.queryList(page, count, query, sortName, order, groupAlias, status, containMobileDevice);
+
+ return channelService.queryList(page, count, groupAlias, status, geoCoordSys);
}
@GetMapping(value = "/camera/list-with-child")
@@ -93,15 +69,14 @@ public class CameraChannelController {
@Parameter(name = "groupAlias", description = "分组别名")
@Parameter(name = "geoCoordSys", description = "坐标系类型:WGS84,GCJ02、BD09")
@Parameter(name = "status", description = "摄像头状态")
- @Parameter(name = "containMobileDevice", description = "是否包含移动设备")
- public PageInfo list(@RequestParam(required = false, value = "page", defaultValue = "1" )Integer page,
+ public PageInfo queryListWithChild(@RequestParam(required = false, value = "page", defaultValue = "1" )Integer page,
@RequestParam(required = false, value = "page", defaultValue = "100")Integer count,
@RequestParam(required = false) String query,
@RequestParam(required = false) String sortName,
@RequestParam(required = false) String order,
- @RequestParam(required = false) String groupAlias,
- @RequestParam(required = false) Boolean status,
- @RequestParam(required = false) Boolean containMobileDevice){
+ String groupAlias,
+ @RequestParam(required = false) String geoCoordSys,
+ @RequestParam(required = false) Boolean status){
if (ObjectUtils.isEmpty(query)) {
query = null;
}
@@ -115,7 +90,7 @@ public class CameraChannelController {
groupAlias = null;
}
- return channelService.queryList(page, count, query, sortName, order, groupAlias, status, containMobileDevice);
+ return channelService.queryListWithChild(page, count, query, sortName, order, groupAlias, status, geoCoordSys);
}
@GetMapping(value = "/camera/one")
@@ -138,20 +113,20 @@ public class CameraChannelController {
@Parameter(name = "longitude", description = "经度")
@Parameter(name = "latitude", description = "纬度")
@Parameter(name = "geoCoordSys", description = "坐标系类型:WGS84,GCJ02、BD09")
- public CameraChannel updateCamera(String deviceId,
+ public void updateCamera(String deviceId,
@RequestParam(required = false) String deviceCode,
@RequestParam(required = false) String name,
@RequestParam(required = false) Double longitude,
@RequestParam(required = false) Double latitude,
@RequestParam(required = false) String geoCoordSys) {
- return channelService.updateCamera(deviceId, deviceCode, name, longitude, latitude, geoCoordSys);
+ channelService.updateCamera(deviceId, deviceCode, name, longitude, latitude, geoCoordSys);
}
@PostMapping(value = "/camera/list/ids")
@ResponseBody
@Operation(summary = "根据编号查询多个摄像头信息", security = @SecurityRequirement(name = JwtUtils.HEADER))
- public List queryListByNos(@RequestBody IdsQueryParam param) {
- return channelService.queryListByNos(deviceId, deviceCode, name, longitude, latitude, geoCoordSys);;
+ public List queryListByDeviceIds(@RequestBody List deviceIds) {
+ return channelService.queryListByDeviceIds(deviceIds);
}
@GetMapping(value = "/camera/list/box")
diff --git a/src/main/java/com/genersoft/iot/vmp/web/custom/bean/CameraChannel.java b/src/main/java/com/genersoft/iot/vmp/web/custom/bean/CameraChannel.java
index f3fae701c..119581c6a 100644
--- a/src/main/java/com/genersoft/iot/vmp/web/custom/bean/CameraChannel.java
+++ b/src/main/java/com/genersoft/iot/vmp/web/custom/bean/CameraChannel.java
@@ -13,4 +13,9 @@ public class CameraChannel extends CommonGBChannel {
@Setter
@Schema(description = "摄像头设备国标编号")
private String deviceCode;
+
+ @Getter
+ @Setter
+ @Schema(description = "图标路径")
+ private String icon;
}
diff --git a/src/main/java/com/genersoft/iot/vmp/web/custom/bean/CameraGroup.java b/src/main/java/com/genersoft/iot/vmp/web/custom/bean/CameraGroup.java
new file mode 100644
index 000000000..48ed1be76
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/web/custom/bean/CameraGroup.java
@@ -0,0 +1,31 @@
+package com.genersoft.iot.vmp.web.custom.bean;
+
+import com.genersoft.iot.vmp.gb28181.bean.Group;
+import lombok.Getter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CameraGroup extends Group {
+
+ @Getter
+ private CameraGroup parent;
+
+ @Getter
+ private final List child = new ArrayList<>();
+
+ public void setParent(CameraGroup parent) {
+ if (parent == null) {
+ return;
+ }
+ this.parent = parent;
+ parent.addChild(this);
+ }
+
+ public void addChild(CameraGroup child) {
+ this.child.add(child);
+ if (this.parent != null) {
+ this.parent.addChild(child);
+ }
+ }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/web/custom/service/CameraChannelService.java b/src/main/java/com/genersoft/iot/vmp/web/custom/service/CameraChannelService.java
index 3a1c3ce0d..63145c4cc 100644
--- a/src/main/java/com/genersoft/iot/vmp/web/custom/service/CameraChannelService.java
+++ b/src/main/java/com/genersoft/iot/vmp/web/custom/service/CameraChannelService.java
@@ -1,24 +1,24 @@
package com.genersoft.iot.vmp.web.custom.service;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
import com.genersoft.iot.vmp.common.StreamInfo;
-import com.genersoft.iot.vmp.common.enums.ChannelDataType;
import com.genersoft.iot.vmp.conf.UserSetting;
import com.genersoft.iot.vmp.conf.exception.ControllerException;
import com.genersoft.iot.vmp.gb28181.bean.CommonGBChannel;
-import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.FrontEndControlCodeForPTZ;
import com.genersoft.iot.vmp.gb28181.bean.Group;
import com.genersoft.iot.vmp.gb28181.dao.CommonGBChannelMapper;
-import com.genersoft.iot.vmp.gb28181.dao.DeviceChannelMapper;
import com.genersoft.iot.vmp.gb28181.dao.DeviceMapper;
import com.genersoft.iot.vmp.gb28181.dao.GroupMapper;
import com.genersoft.iot.vmp.gb28181.service.IGbChannelControlService;
import com.genersoft.iot.vmp.gb28181.service.IGbChannelPlayService;
+import com.genersoft.iot.vmp.gb28181.service.IGroupService;
import com.genersoft.iot.vmp.service.bean.ErrorCallback;
import com.genersoft.iot.vmp.utils.Coordtransform;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
-import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import com.genersoft.iot.vmp.web.custom.bean.CameraChannel;
+import com.genersoft.iot.vmp.web.custom.bean.CameraGroup;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.xiaoymin.knife4j.core.util.Assert;
@@ -27,9 +27,11 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
-import org.springframework.web.context.request.async.DeferredResult;
+import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
@Slf4j
@Service
@@ -44,6 +46,9 @@ public class CameraChannelService implements CommandLineRunner {
@Autowired
private GroupMapper groupMapper;
+ @Autowired
+ private IGroupService groupService;
+
@Autowired
private RedisTemplate