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 redisTemplate; @@ -62,13 +67,31 @@ public class CameraChannelService implements CommandLineRunner { } - public PageInfo queryList(Integer page, Integer count, String query, String sortName, String order, String groupAlias, Boolean status, Boolean containMobileDevice) { + public PageInfo queryList(Integer page, Integer count, String groupAlias, Boolean status, String geoCoordSys) { // 构建组织结构信息 Group group = groupMapper.queryGroupByAlias(groupAlias); Assert.notNull(group, "获取组织结构失败"); String groupDeviceId = group.getDeviceId(); + // 构建分页 + PageHelper.startPage(page, count); + + List all = channelMapper.queryListForSy(groupDeviceId, status); + PageInfo groupPageInfo = new PageInfo<>(all); + List list = addIconPathAndPositionForCameraChannelList(groupPageInfo.getList(), geoCoordSys); + groupPageInfo.setList(list); + return groupPageInfo; + } + + public PageInfo queryListWithChild(Integer page, Integer count, String query, String sortName, String order, String groupAlias, Boolean status, String geoCoordSys) { + // 构建组织结构信息 + CameraGroup group = groupMapper.queryGroupByAlias(groupAlias); + Assert.notNull(group, "获取组织结构失败"); + String groupDeviceId = group.getDeviceId(); + // 获取所有子节点 + List groupList = queryAllGroupChildren(group.getId(), group.getBusinessGroup()); + groupList.add(group); // 构建分页 PageHelper.startPage(page, count); if (query != null) { @@ -77,35 +100,70 @@ public class CameraChannelService implements CommandLineRunner { .replaceAll("_", "/_"); } - List all = channelMapper.queryListForSy(query, sortName, order, groupDeviceId, status, containMobileDevice); + List all = channelMapper.queryListWithChildForSy(query, sortName, order, groupList, status); PageInfo groupPageInfo = new PageInfo<>(all); - List list = addIconPathForCameraChannelList(groupPageInfo.getList()); + List list = addIconPathAndPositionForCameraChannelList(groupPageInfo.getList(), geoCoordSys); groupPageInfo.setList(list); return groupPageInfo; } + // 获取所有子节点 + private List queryAllGroupChildren(int groupId, String businessGroup) { + Map groupMap = groupMapper.queryByBusinessGroupForMap(businessGroup); + for (CameraGroup cameraGroup : groupMap.values()) { + cameraGroup.setParent(groupMap.get(cameraGroup.getParentId())); + } + CameraGroup cameraGroup = groupMap.get(groupId); + if (cameraGroup == null) { + return Collections.emptyList(); + }else { + return cameraGroup.getChild(); + } + } + /** - * 为通道增加图片信息 + * 为通道增加图片信息和转换坐标系 */ - private List addIconPathForCameraChannelList(List channels) { + private List addIconPathAndPositionForCameraChannelList(List channels, String geoCoordSys) { + // 读取redis 图标信息 + JSONArray jsonArray = (JSONArray) redisTemplate.opsForValue().get("machineInfo"); + Map pathMap = new HashMap<>(); + if (jsonArray != null && !jsonArray.isEmpty()) { + for (int i = 0; i < jsonArray.size(); i++) { + JSONObject jsonObject = jsonArray.getJSONObject(i); + String machineType = jsonObject.getString("machineType"); + String imagesPath = jsonObject.getString("imagesPath"); + if (machineType != null && imagesPath != null) { + pathMap.put(machineType, imagesPath); + } + } + }else { + log.warn("[读取通道图标信息失败]"); + } + for (CameraChannel channel : channels) { + if (channel.getGbModel() != null && pathMap.get(channel.getGbModel()) != null) { + channel.setIcon(pathMap.get(channel.getGbModel())); + } + // 坐标系转换 + if (geoCoordSys != null && channel.getGbLongitude() != null && channel.getGbLatitude() != null + && channel.getGbLongitude() > 0 && channel.getGbLatitude() > 0) { + if (geoCoordSys.equalsIgnoreCase("GCJ02")) { + Double[] position = Coordtransform.WGS84ToGCJ02(channel.getGbLongitude(), channel.getGbLatitude()); + channel.setGbLongitude(position[0]); + channel.setGbLatitude(position[1]); + }else if (geoCoordSys.equalsIgnoreCase("BD09")) { + Double[] gcj02Position = Coordtransform.WGS84ToGCJ02(channel.getGbLongitude(), channel.getGbLatitude()); + Double[] position = Coordtransform.GCJ02ToBD09(gcj02Position[0], gcj02Position[1]); + channel.setGbLongitude(position[0]); + channel.setGbLatitude(position[1]); + } + } + } return channels; } - private CommonGBChannel queryChannelByDeviceIdAndDeviceCode(String deviceId, String deviceCode) { - CommonGBChannel channel = null; - if (deviceCode != null) { -// Device device = deviceMapper.getDeviceByDeviceId(deviceId); -// Assert.notNull(device, "设备不存在:" + deviceCode); -// Integer deviceDbId = device.getId(); - channel = channelMapper.queryGbChannelByChannelDeviceIdAndGbDeviceId(deviceId, deviceCode); - }else { - channel = channelMapper.queryByDeviceId(deviceId); - } - return channel; - } - public CameraChannel queryOne(String deviceId, String deviceCode, String geoCoordSys) { - CommonGBChannel channel = queryChannelByDeviceIdAndDeviceCode(deviceId, deviceCode); + CommonGBChannel channel = channelMapper.queryGbChannelByChannelDeviceIdAndGbDeviceId(deviceId, deviceCode); Assert.notNull(channel, "通道不存在"); if (geoCoordSys != null && channel.getGbLongitude() != null && channel.getGbLatitude() != null @@ -135,7 +193,7 @@ public class CameraChannelService implements CommandLineRunner { * @param callback 点播结果的回放 */ public void play(String deviceId, String deviceCode, ErrorCallback callback) { - CommonGBChannel channel = queryChannelByDeviceIdAndDeviceCode(deviceId, deviceCode); + CommonGBChannel channel = channelMapper.queryGbChannelByChannelDeviceIdAndGbDeviceId(deviceId, deviceCode); Assert.notNull(channel, "通道不存在"); channelPlayService.play(channel, null, userSetting.getRecordSip(), callback); } @@ -146,13 +204,13 @@ public class CameraChannelService implements CommandLineRunner { * @param deviceCode 通道对应的国标设备的编号 */ public void stopPlay(String deviceId, String deviceCode) { - CommonGBChannel channel = queryChannelByDeviceIdAndDeviceCode(deviceId, deviceCode); + CommonGBChannel channel = channelMapper.queryGbChannelByChannelDeviceIdAndGbDeviceId(deviceId, deviceCode); Assert.notNull(channel, "通道不存在"); channelPlayService.stopPlay(channel); } public void ptz(String deviceId, String deviceCode, String command, Integer speed, ErrorCallback callback) { - CommonGBChannel channel = queryChannelByDeviceIdAndDeviceCode(deviceId, deviceCode); + CommonGBChannel channel = channelMapper.queryGbChannelByChannelDeviceIdAndGbDeviceId(deviceId, deviceCode); Assert.notNull(channel, "通道不存在"); if (speed == null) { @@ -207,6 +265,36 @@ public class CameraChannelService implements CommandLineRunner { channelControlService.ptz(channel, controlCode, callback); } - public CameraChannel updateCamera(String deviceId, String deviceCode, String name, Double longitude, Double latitude, String geoCoordSys) { + public void updateCamera(String deviceId, String deviceCode, String name, Double longitude, Double latitude, String geoCoordSys) { + CommonGBChannel commonGBChannel = channelMapper.queryGbChannelByChannelDeviceIdAndGbDeviceId(deviceId, deviceCode); + Assert.notNull(commonGBChannel, "通道不存在"); + commonGBChannel.setGbName(name); + if (geoCoordSys != null && longitude != null && latitude != null + && longitude > 0 && latitude > 0) { + if (geoCoordSys.equalsIgnoreCase("GCJ02")) { + Double[] position = Coordtransform.WGS84ToGCJ02(longitude, latitude); + commonGBChannel.setGbLongitude(position[0]); + commonGBChannel.setGbLatitude(position[1]); + }else if (geoCoordSys.equalsIgnoreCase("BD09")) { + Double[] gcj02Position = Coordtransform.WGS84ToGCJ02(longitude, latitude); + Double[] position = Coordtransform.GCJ02ToBD09(gcj02Position[0], gcj02Position[1]); + commonGBChannel.setGbLongitude(position[0]); + commonGBChannel.setGbLatitude(position[1]); + }else { + commonGBChannel.setGbLongitude(longitude); + commonGBChannel.setGbLatitude(latitude); + } + }else { + commonGBChannel.setGbLongitude(longitude); + commonGBChannel.setGbLatitude(latitude); + } + channelMapper.update(commonGBChannel); } + + public List queryListByDeviceIds(List deviceIds) { + return channelMapper.queryListByDeviceIds(deviceIds); + } + + + }