jiang
2022-07-13 fc89b7b517e191fb6c9b66fa86dd05ebab0f54c5
src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/device/DeviceQuery.java
@@ -6,7 +6,6 @@
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
import com.genersoft.iot.vmp.gb28181.bean.SubscribeHolder;
import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
import com.genersoft.iot.vmp.gb28181.event.DeviceOffLineDetector;
import com.genersoft.iot.vmp.gb28181.task.ISubscribeTask;
import com.genersoft.iot.vmp.gb28181.task.impl.CatalogSubscribeTask;
import com.genersoft.iot.vmp.gb28181.task.impl.MobilePositionSubscribeTask;
@@ -16,22 +15,29 @@
import com.genersoft.iot.vmp.service.IDeviceService;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.IVideoManagerStorage;
import com.genersoft.iot.vmp.vmanager.bean.BaseTree;
import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.compress.utils.IOUtils;
import org.apache.http.HttpResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.async.DeferredResult;
import javax.servlet.http.HttpServletResponse;
import javax.sip.DialogState;
import java.io.*;
import java.nio.file.Files;
import java.util.*;
@Api(tags = "国标设备查询", value = "国标设备查询")
@@ -54,9 +60,6 @@
   
   @Autowired
   private DeferredResultHolder resultHolder;
   @Autowired
   private DeviceOffLineDetector offLineDetector;
   @Autowired
   private IDeviceService deviceService;
@@ -128,12 +131,14 @@
         @ApiImplicitParam(name="query", value = "查询内容" ,dataTypeClass = String.class),
         @ApiImplicitParam(name="online", value = "是否在线"  ,dataTypeClass = Boolean.class),
         @ApiImplicitParam(name="channelType", value = "设备/子目录-> false/true" ,dataTypeClass = Boolean.class),
         @ApiImplicitParam(name="catalogUnderDevice", value = "是否直属与设备的目录" ,dataTypeClass = Boolean.class),
   })
   public ResponseEntity<PageInfo> channels(@PathVariable String deviceId,
                                    int page, int count,
                                    @RequestParam(required = false) String query,
                                    @RequestParam(required = false) Boolean online,
                                    @RequestParam(required = false) Boolean channelType) {
                                    @RequestParam(required = false) Boolean channelType,
                                    @RequestParam(required = false) Boolean catalogUnderDevice) {
//      if (logger.isDebugEnabled()) {
//         logger.debug("查询视频设备通道API调用");
//      }
@@ -141,7 +146,7 @@
         query = null;
      }
      PageInfo pageResult = storager.queryChannelsByDeviceId(deviceId, query, channelType, online, page, count);
      PageInfo pageResult = storager.queryChannelsByDeviceId(deviceId, query, channelType, online, catalogUnderDevice, page, count);
      return new ResponseEntity<>(pageResult,HttpStatus.OK);
   }
@@ -202,6 +207,11 @@
         Set<String> allKeys = dynamicTask.getAllKeys();
         for (String key : allKeys) {
            if (key.startsWith(deviceId)) {
               Runnable runnable = dynamicTask.get(key);
               if (runnable instanceof ISubscribeTask) {
                  ISubscribeTask subscribeTask = (ISubscribeTask) runnable;
                  subscribeTask.stop();
               }
               dynamicTask.stop(key);
            }
         }
@@ -290,7 +300,8 @@
   public ResponseEntity<PageInfo> updateTransport(@PathVariable String deviceId, @PathVariable String streamMode){
      Device device = storager.queryVideoDevice(deviceId);
      device.setStreamMode(streamMode);
      storager.updateDevice(device);
//      storager.updateDevice(device);
      deviceService.updateDevice(device);
      return new ResponseEntity<>(null,HttpStatus.OK);
   }
@@ -307,45 +318,7 @@
   public ResponseEntity<WVPResult<String>> updateDevice(Device device){
      if (device != null && device.getDeviceId() != null) {
         Device deviceInStore = storager.queryVideoDevice(device.getDeviceId());
         if (!StringUtils.isEmpty(device.getName())) deviceInStore.setName(device.getName());
         if (!StringUtils.isEmpty(device.getCharset())) deviceInStore.setCharset(device.getCharset());
         if (!StringUtils.isEmpty(device.getMediaServerId())) deviceInStore.setMediaServerId(device.getMediaServerId());
         //  目录订阅相关的信息
         if (device.getSubscribeCycleForCatalog() > 0) {
            if (deviceInStore.getSubscribeCycleForCatalog() == 0 || deviceInStore.getSubscribeCycleForCatalog() != device.getSubscribeCycleForCatalog()) {
               deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog());
               // 开启订阅
               deviceService.addCatalogSubscribe(deviceInStore);
            }
         }else if (device.getSubscribeCycleForCatalog() == 0) {
            if (deviceInStore.getSubscribeCycleForCatalog() != 0) {
               deviceInStore.setSubscribeCycleForCatalog(device.getSubscribeCycleForCatalog());
               // 取消订阅
               deviceService.removeCatalogSubscribe(deviceInStore);
            }
         }
         // 移动位置订阅相关的信息
         if (device.getSubscribeCycleForMobilePosition() > 0) {
            if (deviceInStore.getSubscribeCycleForMobilePosition() == 0 || deviceInStore.getSubscribeCycleForMobilePosition() != device.getSubscribeCycleForMobilePosition()) {
               deviceInStore.setMobilePositionSubmissionInterval(device.getMobilePositionSubmissionInterval());
               deviceInStore.setSubscribeCycleForMobilePosition(device.getSubscribeCycleForMobilePosition());
               // 开启订阅
               deviceService.addMobilePositionSubscribe(deviceInStore);
            }
         }else if (device.getSubscribeCycleForMobilePosition() == 0) {
            if (deviceInStore.getSubscribeCycleForMobilePosition() != 0) {
               // 取消订阅
               deviceService.removeMobilePositionSubscribe(deviceInStore);
            }
         }
         // TODO 报警订阅相关的信息
         storager.updateDevice(device);
         cmder.deviceInfoQuery(device);
         deviceService.updateDevice(device);
      }
      WVPResult<String> result = new WVPResult<>();
      result.setCode(0);
@@ -370,6 +343,11 @@
      Device device = storager.queryVideoDevice(deviceId);
      String uuid = UUID.randomUUID().toString();
      String key = DeferredResultHolder.CALLBACK_CMD_DEVICESTATUS + deviceId;
      DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(2*1000L);
      if(device == null) {
         result.setResult(new ResponseEntity(String.format("设备%s不存在", deviceId),HttpStatus.OK));
         return result;
      }
      cmder.deviceStatusQuery(device, event -> {
         RequestMessage msg = new RequestMessage();
         msg.setId(uuid);
@@ -377,7 +355,6 @@
         msg.setData(String.format("获取设备状态失败,错误码: %s, %s", event.statusCode, event.msg));
         resultHolder.invokeResult(msg);
      });
        DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(2*1000L);
      result.onTimeout(()->{
         logger.warn(String.format("获取设备状态超时"));
         // 释放rtpserver
@@ -490,4 +467,112 @@
      wvpResult.setData(dialogStateMap);
      return wvpResult;
   }
   @GetMapping("/snap/{deviceId}/{channelId}")
   @ApiOperation(value = "请求截图", notes = "请求截图")
   public void getSnap(HttpServletResponse resp, @PathVariable String deviceId, @PathVariable String channelId) {
      try {
         final InputStream in = Files.newInputStream(new File("snap" + File.separator + deviceId + "_" + channelId + ".jpg").toPath());
         resp.setContentType(MediaType.IMAGE_PNG_VALUE);
         IOUtils.copy(in, resp.getOutputStream());
      } catch (IOException e) {
         resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
      }
   }
   /**
    * 查询国标树
    * @param deviceId 设备ID
    * @param parentId 父ID
    * @param page 当前页
    * @param count 每页条数
    * @return 国标设备
    */
   @ApiOperation("查询国标树")
   @ApiImplicitParams({
         @ApiImplicitParam(name = "deviceId", value = "设备ID", required = true, dataTypeClass = String.class),
         @ApiImplicitParam(name = "parentId", value = "父ID", required = false, dataTypeClass = String.class),
         @ApiImplicitParam(name = "onlyCatalog", value = "只获取目录", required = false, dataTypeClass = Boolean.class),
         @ApiImplicitParam(name="page", value = "当前页", required = true, dataTypeClass = Integer.class),
         @ApiImplicitParam(name="count", value = "每页条数", required = true, dataTypeClass = Integer.class),
   })
   @GetMapping("/tree/{deviceId}")
   public ResponseEntity<PageInfo> getTree(@PathVariable String deviceId, @RequestParam(required = false) String parentId, @RequestParam(required = false) Boolean onlyCatalog, int page, int count){
      if (page <= 0) {
         page = 1;
      }
      if (onlyCatalog == null) {
         onlyCatalog = false;
      }
      List<BaseTree<DeviceChannel>> treeData = deviceService.queryVideoDeviceTree(deviceId, parentId, onlyCatalog);
      if (treeData == null || (page - 1) * count > treeData.size()) {
         PageInfo<BaseTree<DeviceChannel>> pageInfo = new PageInfo<>();
         pageInfo.setPageNum(page);
         pageInfo.setTotal(treeData == null? 0 : treeData.size());
         pageInfo.setSize(0);
         pageInfo.setList(new ArrayList<>());
         return new ResponseEntity<>(pageInfo,HttpStatus.OK);
      }
      int toIndex = Math.min(page * count, treeData.size());
      // 处理分页
      List<BaseTree<DeviceChannel>> trees = treeData.subList((page - 1) * count, toIndex);
      PageInfo<BaseTree<DeviceChannel>> pageInfo = new PageInfo<>();
      pageInfo.setPageNum(page);
      pageInfo.setTotal(treeData.size());
      pageInfo.setSize(trees.size());
      pageInfo.setList(trees);
      return new ResponseEntity<>(pageInfo,HttpStatus.OK);
   }
   /**
    * 查询国标树下的通道
    * @param deviceId 设备ID
    * @param parentId 父ID
    * @param page 当前页
    * @param count 每页条数
    * @return 国标设备
    */
   @ApiOperation("查询国标树下的通道")
   @ApiImplicitParams({
         @ApiImplicitParam(name = "deviceId", value = "设备ID", required = true, dataTypeClass = String.class),
         @ApiImplicitParam(name = "parentId", value = "父ID", required = false, dataTypeClass = String.class),
         @ApiImplicitParam(name="page", value = "当前页", required = true, dataTypeClass = Integer.class),
         @ApiImplicitParam(name="count", value = "每页条数", required = true, dataTypeClass = Integer.class),
   })
   @GetMapping("/tree/channel/{deviceId}")
   public ResponseEntity<PageInfo> getChannelInTreeNode(@PathVariable String deviceId, @RequestParam(required = false) String parentId, int page, int count){
      if (page <= 0) {
         page = 1;
      }
      List<DeviceChannel> treeData = deviceService.queryVideoDeviceInTreeNode(deviceId, parentId);
      if (treeData == null || (page - 1) * count > treeData.size()) {
         PageInfo<BaseTree<DeviceChannel>> pageInfo = new PageInfo<>();
         pageInfo.setPageNum(page);
         pageInfo.setTotal(treeData == null? 0 : treeData.size());
         pageInfo.setSize(0);
         pageInfo.setList(new ArrayList<>());
         return new ResponseEntity<>(pageInfo,HttpStatus.OK);
      }
      int toIndex = Math.min(page * count, treeData.size());
      // 处理分页
      List<DeviceChannel> trees = treeData.subList((page - 1) * count, toIndex);
      PageInfo<DeviceChannel> pageInfo = new PageInfo<>();
      pageInfo.setPageNum(page);
      pageInfo.setTotal(treeData.size());
      pageInfo.setSize(trees.size());
      pageInfo.setList(trees);
      return new ResponseEntity<>(pageInfo,HttpStatus.OK);
   }
}