From 1af77ab5f7c11a4b3d59c1989b51b9fca29679ce Mon Sep 17 00:00:00 2001 From: 648540858 <648540858@qq.com> Date: 星期二, 18 十月 2022 22:18:49 +0800 Subject: [PATCH] Merge pull request #645 from IKangXu/wvp-28181-2.0 --- src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java | 278 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 246 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java index c266ff6..d0aff58 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/streamPush/StreamPushController.java @@ -1,20 +1,53 @@ package com.genersoft.iot.vmp.vmanager.streamPush; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelReader; +import com.alibaba.excel.read.metadata.ReadSheet; +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.SecurityUtils; +import com.genersoft.iot.vmp.conf.security.dto.LoginUser; import com.genersoft.iot.vmp.gb28181.bean.GbStream; +import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder; +import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage; +import com.genersoft.iot.vmp.media.zlm.dto.StreamAuthorityInfo; import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem; +import com.genersoft.iot.vmp.service.IMediaServerService; +import com.genersoft.iot.vmp.service.IMediaService; import com.genersoft.iot.vmp.service.IStreamPushService; +import com.genersoft.iot.vmp.service.impl.StreamPushUploadFileHandler; +import com.genersoft.iot.vmp.vmanager.bean.BatchGBStreamParam; +import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; +import com.genersoft.iot.vmp.vmanager.bean.StreamPushExcelDto; +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 io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.poi.sl.usermodel.Sheet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; +import org.springframework.web.context.request.async.DeferredResult; +import org.springframework.web.multipart.MultipartFile; -@Api(tags = "鎺ㄦ祦淇℃伅绠$悊") +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +@Tag(name = "鎺ㄦ祦淇℃伅绠$悊") @Controller @CrossOrigin @RequestMapping(value = "/api/push") @@ -25,50 +58,231 @@ @Autowired private IStreamPushService streamPushService; - @ApiOperation("鎺ㄦ祦鍒楄〃鏌ヨ") - @ApiImplicitParams({ - @ApiImplicitParam(name="page", value = "褰撳墠椤�", required = true, dataTypeClass = Integer.class), - @ApiImplicitParam(name="count", value = "姣忛〉鏌ヨ鏁伴噺", required = true, dataTypeClass = Integer.class), - @ApiImplicitParam(name="query", value = "鏌ヨ鍐呭", dataTypeClass = String.class), - @ApiImplicitParam(name="online", value = "鏄惁鍦ㄧ嚎", dataTypeClass = Boolean.class), - }) + @Autowired + private IMediaServerService mediaServerService; + + @Autowired + private DeferredResultHolder resultHolder; + + @Autowired + private IMediaService mediaService; + + @Autowired + private UserSetting userSetting; + @GetMapping(value = "/list") @ResponseBody + @Operation(summary = "鎺ㄦ祦鍒楄〃鏌ヨ") + @Parameter(name = "page", description = "褰撳墠椤�") + @Parameter(name = "count", description = "姣忛〉鏌ヨ鏁伴噺") + @Parameter(name = "query", description = "鏌ヨ鍐呭") + @Parameter(name = "pushing", description = "鏄惁姝e湪鎺ㄦ祦") + @Parameter(name = "mediaServerId", description = "娴佸獟浣揑D") public PageInfo<StreamPushItem> list(@RequestParam(required = false)Integer page, @RequestParam(required = false)Integer count, @RequestParam(required = false)String query, - @RequestParam(required = false)Boolean online ){ + @RequestParam(required = false)Boolean pushing, + @RequestParam(required = false)String mediaServerId ){ - PageInfo<StreamPushItem> pushList = streamPushService.getPushList(page - 1, page - 1 + count); + if (ObjectUtils.isEmpty(query)) { + query = null; + } + if (ObjectUtils.isEmpty(mediaServerId)) { + mediaServerId = null; + } + PageInfo<StreamPushItem> pushList = streamPushService.getPushList(page, count, query, pushing, mediaServerId); return pushList; } - @ApiOperation("灏嗘帹娴佹坊鍔犲埌鍥芥爣") - @ApiImplicitParams({ - @ApiImplicitParam(name = "stream", value = "鐩存挱娴佸叧鑱斿浗鏍囧钩鍙�", dataTypeClass = GbStream.class), - }) @PostMapping(value = "/save_to_gb") @ResponseBody - public Object saveToGB(@RequestBody GbStream stream){ - if (streamPushService.saveToGB(stream)){ - return "success"; - }else { - return "fail"; + @Operation(summary = "灏嗘帹娴佹坊鍔犲埌鍥芥爣") + public void saveToGB(@RequestBody GbStream stream){ + if (!streamPushService.saveToGB(stream)){ + throw new ControllerException(ErrorCode.ERROR100); } } - @ApiOperation("灏嗘帹娴佺Щ鍑哄埌鍥芥爣") - @ApiImplicitParams({ - @ApiImplicitParam(name = "stream", value = "鐩存挱娴佸叧鑱斿浗鏍囧钩鍙�", dataTypeClass = GbStream.class), - }) @DeleteMapping(value = "/remove_form_gb") @ResponseBody - public Object removeFormGB(@RequestBody GbStream stream){ - if (streamPushService.removeFromGB(stream)){ - return "success"; - }else { - return "fail"; + @Operation(summary = "灏嗘帹娴佺Щ鍑哄埌鍥芥爣") + public void removeFormGB(@RequestBody GbStream stream){ + if (!streamPushService.removeFromGB(stream)){ + throw new ControllerException(ErrorCode.ERROR100); + } + } + + + @PostMapping(value = "/stop") + @ResponseBody + @Operation(summary = "涓涓�涓帹娴�") + @Parameter(name = "app", description = "搴旂敤鍚�", required = true) + @Parameter(name = "stream", description = "娴乮d", required = true) + public void stop(String app, String streamId){ + if (!streamPushService.stop(app, streamId)){ + throw new ControllerException(ErrorCode.ERROR100); + } + } + + @DeleteMapping(value = "/batchStop") + @ResponseBody + @Operation(summary = "涓澶氫釜鎺ㄦ祦") + public void batchStop(@RequestBody BatchGBStreamParam batchGBStreamParam){ + if (batchGBStreamParam.getGbStreams().size() == 0) { + throw new ControllerException(ErrorCode.ERROR100); + } + if (!streamPushService.batchStop(batchGBStreamParam.getGbStreams())){ + throw new ControllerException(ErrorCode.ERROR100); + } + } + + @PostMapping(value = "upload") + @ResponseBody + public DeferredResult<ResponseEntity<WVPResult<Object>>> uploadChannelFile(@RequestParam(value = "file") MultipartFile file){ + + // 鏈�澶氬鐞嗘枃浠朵竴涓皬鏃� + DeferredResult<ResponseEntity<WVPResult<Object>>> result = new DeferredResult<>(60*60*1000L); + // 褰曞儚鏌ヨ浠hannelId浣滀负deviceId鏌ヨ + String key = DeferredResultHolder.UPLOAD_FILE_CHANNEL; + String uuid = UUID.randomUUID().toString(); + logger.info("閫氶亾瀵煎叆鏂囦欢绫诲瀷: {}",file.getContentType() ); + if (file.isEmpty()) { + logger.warn("閫氶亾瀵煎叆鏂囦欢涓虹┖"); + WVPResult<Object> wvpResult = new WVPResult<>(); + wvpResult.setCode(-1); + wvpResult.setMsg("鏂囦欢涓虹┖"); + result.setResult(ResponseEntity.status(HttpStatus.BAD_REQUEST).body(wvpResult)); + return result; + } + if (file.getContentType() == null) { + WVPResult<Object> wvpResult = new WVPResult<>(); + wvpResult.setCode(-1); + wvpResult.setMsg("鏃犳硶璇嗗埆鏂囦欢绫诲瀷"); + result.setResult(ResponseEntity.status(HttpStatus.BAD_REQUEST).body(wvpResult)); + return result; + } + // 鍚屾椂鍙鐞嗕竴涓枃浠� + if (resultHolder.exist(key, null)) { + logger.warn("宸叉湁瀵煎叆浠诲姟姝e湪鎵ц"); + WVPResult<Object> wvpResult = new WVPResult<>(); + wvpResult.setCode(-1); + wvpResult.setMsg("宸叉湁瀵煎叆浠诲姟姝e湪鎵ц"); + result.setResult(ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS).body(wvpResult)); + return result; + } + + resultHolder.put(key, uuid, result); + result.onTimeout(()->{ + logger.warn("閫氶亾瀵煎叆瓒呮椂锛屽彲鑳芥枃浠惰繃澶�"); + RequestMessage msg = new RequestMessage(); + msg.setKey(key); + WVPResult<Object> wvpResult = new WVPResult<>(); + wvpResult.setCode(-1); + wvpResult.setMsg("瀵煎叆瓒呮椂锛屽彲鑳芥枃浠惰繃澶�"); + msg.setData(wvpResult); + resultHolder.invokeAllResult(msg); + }); + //鑾峰彇鏂囦欢娴� + InputStream inputStream = null; + try { + String name = file.getName(); + inputStream = file.getInputStream(); + } catch (IOException e) { + e.printStackTrace(); + } + try { + //浼犲叆鍙傛暟 + ExcelReader excelReader = EasyExcel.read(inputStream, StreamPushExcelDto.class, + new StreamPushUploadFileHandler(streamPushService, mediaServerService.getDefaultMediaServer().getId(), (errorStreams, errorGBs)->{ + logger.info("閫氶亾瀵煎叆鎴愬姛锛屽瓨鍦ㄩ噸澶岮pp+Stream涓簕}涓紝瀛樺湪鍥芥爣ID涓簕}涓�", errorStreams.size(), errorGBs.size()); + RequestMessage msg = new RequestMessage(); + msg.setKey(key); + WVPResult<Map<String, List<String>>> wvpResult = new WVPResult<>(); + if (errorStreams.size() == 0 && errorGBs.size() == 0) { + wvpResult.setCode(0); + wvpResult.setMsg("鎴愬姛"); + }else { + wvpResult.setCode(1); + wvpResult.setMsg("瀵煎叆鎴愬姛銆備絾鏄瓨鍦ㄩ噸澶嶆暟鎹�"); + Map<String, List<String>> errorData = new HashMap<>(); + errorData.put("gbId", errorGBs); + errorData.put("stream", errorStreams); + wvpResult.setData(errorData); + } + msg.setData(wvpResult); + resultHolder.invokeAllResult(msg); + })).build(); + ReadSheet readSheet = EasyExcel.readSheet(0).build(); + excelReader.read(readSheet); + excelReader.finish(); + }catch (Exception e) { + logger.warn("閫氶亾瀵煎叆澶辫触锛�", e); + RequestMessage msg = new RequestMessage(); + msg.setKey(key); + WVPResult<Object> wvpResult = new WVPResult<>(); + wvpResult.setCode(-1); + wvpResult.setMsg("閫氶亾瀵煎叆澶辫触: " + e.getMessage() ); + msg.setData(wvpResult); + resultHolder.invokeAllResult(msg); + } + + + return result; + } + + /** + * 鑾峰彇鎺ㄦ祦鎾斁鍦板潃 + * @param app 搴旂敤鍚� + * @param stream 娴乮d + * @return + */ + @GetMapping(value = "/getPlayUrl") + @ResponseBody + @Operation(summary = "鑾峰彇鎺ㄦ祦鎾斁鍦板潃") + @Parameter(name = "app", description = "搴旂敤鍚�", required = true) + @Parameter(name = "stream", description = "娴乮d", required = true) + @Parameter(name = "mediaServerId", description = "濯掍綋鏈嶅姟鍣╥d") + public StreamInfo getPlayUrl(@RequestParam String app,@RequestParam String stream, + @RequestParam(required = false) String mediaServerId){ + boolean authority = false; + // 鏄惁鐧婚檰鐢ㄦ埛, 鐧婚檰鐢ㄦ埛杩斿洖瀹屾暣淇℃伅 + LoginUser userInfo = SecurityUtils.getUserInfo(); + if (userInfo!= null) { + authority = true; + } + StreamPushItem push = streamPushService.getPush(app, stream); + if (push != null && !push.isSelf()) { + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鏉ヨ嚜鍏朵粬骞冲彴鐨勬帹娴佷俊鎭�"); + } + StreamInfo streamInfo = mediaService.getStreamInfoByAppAndStreamWithCheck(app, stream, mediaServerId, authority); + if (streamInfo == null){ + throw new ControllerException(ErrorCode.ERROR100.getCode(), "鑾峰彇鎾斁鍦板潃澶辫触"); + } + return streamInfo; + } + + /** + * 娣诲姞鎺ㄦ祦淇℃伅 + * @param stream 鎺ㄦ祦淇℃伅 + * @return + */ + @PostMapping(value = "/add") + @ResponseBody + @Operation(summary = "娣诲姞鎺ㄦ祦淇℃伅") + public void add(@RequestBody StreamPushItem stream){ + if (ObjectUtils.isEmpty(stream.getGbId())) { + throw new ControllerException(ErrorCode.ERROR400.getCode(), "鍥芥爣ID涓嶅彲涓虹┖"); + } + if (ObjectUtils.isEmpty(stream.getApp()) && ObjectUtils.isEmpty(stream.getStream())) { + throw new ControllerException(ErrorCode.ERROR400.getCode(), "app鎴杝tream涓嶅彲涓虹┖"); + } + stream.setStatus(false); + stream.setPushIng(false); + stream.setAliveSecond(0L); + stream.setTotalReaderCount("0"); + if (!streamPushService.add(stream)) { + throw new ControllerException(ErrorCode.ERROR100); } } } -- Gitblit v1.8.0