From 2de4932f1e6ad47be71b9bc4a5770e87d1e1173a Mon Sep 17 00:00:00 2001 From: lin <648540858@qq.com> Date: Thu, 23 Oct 2025 17:44:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BA=91=E7=AB=AF=E5=BD=95?= =?UTF-8?q?=E5=83=8F=E6=89=93=E5=8C=85=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iot/vmp/service/ICloudRecordService.java | 5 + .../service/impl/CloudRecordServiceImpl.java | 43 ++++++++ .../dao/CloudRecordServiceMapper.java | 13 ++- .../genersoft/iot/vmp/utils/HttpUtils.java | 51 +++++++++ .../cloudRecord/CloudRecordController.java | 101 ++++++++++++++---- .../cloudRecord/bean/CloudRecordUrl.java | 30 ++---- .../web/custom/CameraChannelController.java | 101 +++++++----------- .../conf/CachedBodyHttpServletRequest.java | 1 + web/src/api/cloudRecord.js | 3 +- web/src/views/cloudRecord/index.vue | 42 +++++++- 10 files changed, 282 insertions(+), 108 deletions(-) create mode 100644 src/main/java/com/genersoft/iot/vmp/utils/HttpUtils.java diff --git a/src/main/java/com/genersoft/iot/vmp/service/ICloudRecordService.java b/src/main/java/com/genersoft/iot/vmp/service/ICloudRecordService.java index af32e77cb..80e865a1e 100755 --- a/src/main/java/com/genersoft/iot/vmp/service/ICloudRecordService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/ICloudRecordService.java @@ -6,6 +6,7 @@ import com.genersoft.iot.vmp.media.bean.MediaServer; import com.genersoft.iot.vmp.service.bean.CloudRecordItem; import com.genersoft.iot.vmp.service.bean.DownloadFileInfo; import com.genersoft.iot.vmp.service.bean.ErrorCallback; +import com.genersoft.iot.vmp.vmanager.cloudRecord.bean.CloudRecordUrl; import com.github.pagehelper.PageInfo; import java.util.List; @@ -68,4 +69,8 @@ public interface ICloudRecordService { void deleteFileByIds(Set ids); void loadMP4File(String app, String stream, int cloudRecordId, ErrorCallback callback); + + List getUrlListByIds(List ids); + + List getUrlList(String app, String stream, String callId); } diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java index a9bf5412f..4dc5df890 100644 --- a/src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java +++ b/src/main/java/com/genersoft/iot/vmp/service/impl/CloudRecordServiceImpl.java @@ -20,6 +20,7 @@ import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.storager.dao.CloudRecordServiceMapper; import com.genersoft.iot.vmp.utils.DateUtil; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; +import com.genersoft.iot.vmp.vmanager.cloudRecord.bean.CloudRecordUrl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; @@ -385,4 +386,46 @@ public class CloudRecordServiceImpl implements ICloudRecordService { throw new ControllerException(ErrorCode.ERROR100.getCode(), stringBuilder.toString()); } } + + @Override + public List getUrlListByIds(List ids) { + List cloudRecordItems = cloudRecordServiceMapper.queryRecordByIds(ids); + if (cloudRecordItems.isEmpty()) { + return List.of(); + } + return getCloudRecordUrl(cloudRecordItems); + } + + @Override + public List getUrlList(String app, String stream, String callId) { + List cloudRecordItems = cloudRecordServiceMapper.queryRecordByAppStreamAndCallId(app, stream, callId); + if (cloudRecordItems.isEmpty()) { + return List.of(); + } + return getCloudRecordUrl(cloudRecordItems); + } + + private List getCloudRecordUrl(List cloudRecordItems) { + if (cloudRecordItems.isEmpty()) { + return List.of(); + } + List resultList = new ArrayList<>(); + for (CloudRecordItem cloudRecordItem : cloudRecordItems) { + CloudRecordUrl cloudRecordUrl = new CloudRecordUrl(); + cloudRecordUrl.setId(cloudRecordItem.getId()); + cloudRecordUrl.setFileName(cloudRecordItem.getStartTime() + ".mp4"); + cloudRecordUrl.setFilePath(cloudRecordItem.getFilePath()); + if (!userSetting.getServerId().equals(cloudRecordItem.getServerId())) { + cloudRecordUrl.setDownloadUrl(redisRpcPlayService.getRecordPlayUrl(cloudRecordItem.getServerId(), cloudRecordItem.getId()).getHttpPath()); + }else { + MediaServer mediaServer = mediaServerService.getOne(cloudRecordItem.getMediaServerId()); + mediaServer.setStreamIp(mediaServer.getIp()); + DownloadFileInfo downloadFilePath = mediaServerService.getDownloadFilePath(mediaServer, RecordInfo.getInstance(cloudRecordItem)); + cloudRecordUrl.setDownloadUrl(downloadFilePath.getHttpPath()); + } + resultList.add(cloudRecordUrl); + } + + return resultList; + } } diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java index 30f6e5111..778920093 100644 --- a/src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java +++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/CloudRecordServiceMapper.java @@ -4,8 +4,8 @@ import com.genersoft.iot.vmp.media.bean.MediaServer; import com.genersoft.iot.vmp.service.bean.CloudRecordItem; import org.apache.ibatis.annotations.*; +import java.util.Collection; import java.util.List; -import java.util.Set; @Mapper public interface CloudRecordServiceMapper { @@ -159,5 +159,14 @@ public interface CloudRecordServiceMapper { " from wvp_cloud_record where id in " + " #{item}" + " ") - List queryRecordByIds(Set ids); + List queryRecordByIds(Collection ids); + + @Select(" ") + List queryRecordByAppStreamAndCallId(String app, String stream, String callId); } diff --git a/src/main/java/com/genersoft/iot/vmp/utils/HttpUtils.java b/src/main/java/com/genersoft/iot/vmp/utils/HttpUtils.java new file mode 100644 index 000000000..407a81389 --- /dev/null +++ b/src/main/java/com/genersoft/iot/vmp/utils/HttpUtils.java @@ -0,0 +1,51 @@ +package com.genersoft.iot.vmp.utils; + +import lombok.extern.slf4j.Slf4j; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.ZipOutputStream; + +@Slf4j +public class HttpUtils { + + public static boolean downLoadFile(String url, ZipOutputStream zos) { + OkHttpClient client = new OkHttpClient(); + Request request = new Request.Builder() + .url(url) + .build(); + + try (Response response = client.newCall(request).execute()) { + if (!response.isSuccessful()) { + log.error("下载失败,HTTP 状态码: {}, URL: {}", response.code(), url); + return false; + } + + // 获取响应体的输入流 + InputStream inputStream = null; + if (response.body() != null) { + inputStream = response.body().byteStream(); + } + if (inputStream == null) { + log.error("响应体为空,无法下载文件: {}", url); + return false; + } + + // 将输入流写入zip文件 + byte[] buffer = new byte[8192]; // 8KB 缓冲区,提高性能 + int bytesRead; + while ((bytesRead = inputStream.read(buffer)) != -1) { + zos.write(buffer, 0, bytesRead); + } + + log.debug("成功下载文件: {}, 大小: {} bytes", url, response.body().contentLength()); + return true; + } catch (IOException e) { + log.error("下载过程中出错: {}, URL: {}", e.getMessage(), url); + return false; + } + } +} diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/CloudRecordController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/CloudRecordController.java index 953392f9d..addd943b6 100755 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/CloudRecordController.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/CloudRecordController.java @@ -14,6 +14,7 @@ import com.genersoft.iot.vmp.service.bean.ErrorCallback; import com.genersoft.iot.vmp.service.bean.InviteErrorCode; import com.genersoft.iot.vmp.streamPush.bean.BatchRemoveParam; import com.genersoft.iot.vmp.utils.DateUtil; +import com.genersoft.iot.vmp.utils.HttpUtils; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import com.genersoft.iot.vmp.vmanager.bean.StreamContent; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; @@ -23,14 +24,14 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -357,6 +358,56 @@ public class CloudRecordController { cloudRecordService.deleteFileByIds(ids.getIds()); } + @ResponseBody + @GetMapping("/download/zip") + public void downloadZipFileFromUrl(HttpServletResponse response, Integer[] ids) { + log.info("[下载指定录像文件的压缩包] 查询 ids->{}", ids); + List arrayList = new ArrayList<>(List.of(ids)); + List cloudRecordItemList = cloudRecordService.getUrlListByIds(arrayList); + if (ObjectUtils.isEmpty(cloudRecordItemList)) { + log.warn("[下载指定录像文件的压缩包] 未找到录像文件,ids->{}", ids); + return; + } + + // 设置响应头 + response.setContentType("application/zip"); + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-Disposition", "attachment; filename=record_" + System.currentTimeMillis() + ".zip"); + + try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { + for (CloudRecordUrl recordUrl : cloudRecordItemList) { + try { + zos.putNextEntry(new ZipEntry(recordUrl.getFileName())); + boolean downloadSuccess = HttpUtils.downLoadFile(recordUrl.getDownloadUrl(), zos); + if (!downloadSuccess) { + log.warn("[下载指定录像文件的压缩包] 下载文件失败: {}", recordUrl.getDownloadUrl()); + zos.closeEntry(); + continue; + } + +// try (FileInputStream fis = new FileInputStream(recordUrl.getFilePath())) { +// byte[] buf = new byte[8192]; // 8KB 缓冲区,提高性能 +// int len; +// while ((len = fis.read(buf)) != -1) { +// zos.write(buf, 0, len); +// } +// } + + zos.closeEntry(); + } catch (Exception e) { + log.error("[下载指定录像文件的压缩包] 处理文件失败: {}, 错误: {}", recordUrl.getFileName(), e.getMessage()); + // 继续处理下一个文件 + } + } + } catch (IOException e) { + log.error("[下载指定录像文件的压缩包] 创建压缩包失败,查询 ids->{}", ids, e); + } + } + + + + + /************************* 以下这些接口只适合wvp和zlm部署在同一台服务器的情况,且wvp只有一个zlm节点的情况 ***************************************/ /** @@ -409,31 +460,45 @@ public class CloudRecordController { if (callId != null && ObjectUtils.isEmpty(callId.trim())) { callId = null; } + // 设置响应头 + response.setContentType("application/zip"); + response.setCharacterEncoding("UTF-8"); if (stream != null && callId != null) { - response.addHeader("Content-Disposition", "attachment;filename=" + stream + "_" + callId + ".zip"); + response.setHeader("Content-Disposition", "attachment;filename=" + stream + "_" + callId + ".zip"); + } else { + response.setHeader("Content-Disposition", "attachment;filename=cloud_record_" + System.currentTimeMillis() + ".zip"); } List cloudRecordItemList = cloudRecordService.getAllList(query, app, stream, startTime, endTime, mediaServers, callId, ids); if (ObjectUtils.isEmpty(cloudRecordItemList)) { return; } - try { - ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()); + try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { for (CloudRecordItem cloudRecordItem : cloudRecordItemList) { - zos.putNextEntry(new ZipEntry(DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss((long)cloudRecordItem.getStartTime()) + ".mp4")); - File file = new File(cloudRecordItem.getFilePath()); - if (!file.exists() || file.isDirectory()) { - continue; + try { + String fileName = DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss((long)cloudRecordItem.getStartTime()) + ".mp4"; + zos.putNextEntry(new ZipEntry(fileName)); + + File file = new File(cloudRecordItem.getFilePath()); + if (!file.exists() || file.isDirectory()) { + log.warn("[下载指定录像文件的压缩包] 文件不存在或为目录: {}", cloudRecordItem.getFilePath()); + zos.closeEntry(); + continue; + } + + try (FileInputStream fis = new FileInputStream(cloudRecordItem.getFilePath())) { + byte[] buf = new byte[8192]; // 8KB 缓冲区,提高性能 + int len; + while ((len = fis.read(buf)) != -1) { + zos.write(buf, 0, len); + } + } + zos.closeEntry(); + log.debug("[下载指定录像文件的压缩包] 成功添加文件: {}", fileName); + } catch (Exception e) { + log.error("[下载指定录像文件的压缩包] 处理文件失败: {}, 错误: {}", cloudRecordItem.getFilePath(), e.getMessage()); + // 继续处理下一个文件 } - FileInputStream fis = new FileInputStream(cloudRecordItem.getFilePath()); - byte[] buf = new byte[2 * 1024]; - int len; - while ((len = fis.read(buf)) != -1) { - zos.write(buf, 0, len); - } - zos.closeEntry(); - fis.close(); } - zos.close(); } catch (IOException e) { log.error("[下载指定录像文件的压缩包] 失败: 查询 app->{}, stream->{}, mediaServerId->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, startTime, endTime, callId, e); } diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/bean/CloudRecordUrl.java b/src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/bean/CloudRecordUrl.java index 20aa12b61..bb75a09c9 100644 --- a/src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/bean/CloudRecordUrl.java +++ b/src/main/java/com/genersoft/iot/vmp/vmanager/cloudRecord/bean/CloudRecordUrl.java @@ -1,32 +1,16 @@ package com.genersoft.iot.vmp.vmanager.cloudRecord.bean; +import lombok.Getter; +import lombok.Setter; + +@Setter +@Getter public class CloudRecordUrl { + private String filePath; private String playUrl; private String downloadUrl; + private String fileName; private int id; - public String getPlayUrl() { - return playUrl; - } - - public void setPlayUrl(String playUrl) { - this.playUrl = playUrl; - } - - public String getDownloadUrl() { - return downloadUrl; - } - - public void setDownloadUrl(String downloadUrl) { - this.downloadUrl = downloadUrl; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } } 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 b6216e0cb..bd1e850b3 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 @@ -15,6 +15,7 @@ import com.genersoft.iot.vmp.service.bean.InviteErrorCode; import com.genersoft.iot.vmp.storager.IRedisCatchStorage; import com.genersoft.iot.vmp.streamPush.service.IStreamPushPlayService; import com.genersoft.iot.vmp.utils.DateUtil; +import com.genersoft.iot.vmp.utils.HttpUtils; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import com.genersoft.iot.vmp.vmanager.bean.StreamContent; import com.genersoft.iot.vmp.vmanager.bean.WVPResult; @@ -36,8 +37,6 @@ import org.springframework.util.ObjectUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.context.request.async.DeferredResult; -import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; @@ -391,81 +390,59 @@ public class CameraChannelController { /** * 下载指定录像文件的压缩包 - * @param query 检索内容 * @param app 应用名 * @param stream 流ID - * @param startTime 开始时间(yyyy-MM-dd HH:mm:ss) - * @param endTime 结束时间(yyyy-MM-dd HH:mm:ss) - * @param mediaServerId 流媒体ID,置空则查询全部流媒体 * @param callId 每次录像的唯一标识,置空则查询全部流媒体 - * @param ids 指定的Id */ @ResponseBody @GetMapping("/record/zip") - public void downloadZipFile(HttpServletResponse response, @RequestParam(required = false) String query, @RequestParam(required = false) String app, @RequestParam(required = false) String stream, @RequestParam(required = false) String startTime, @RequestParam(required = false) String endTime, @RequestParam(required = false) String mediaServerId, @RequestParam(required = false) String callId, @RequestParam(required = false) List ids + public void downloadZipFile(HttpServletResponse response, + @RequestParam(required = false) String app, + @RequestParam(required = false) String stream, + @RequestParam(required = false) String callId ) { - log.info("[下载指定录像文件的压缩包] 查询 app->{}, stream->{}, mediaServerId->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, startTime, endTime, callId); + log.info("[下载指定录像文件的压缩包] 查询 app->{}, stream->{}, callId->{}", app, stream, callId); - List mediaServers; - if (!org.apache.commons.lang3.ObjectUtils.isEmpty(mediaServerId)) { - mediaServers = new ArrayList<>(); - MediaServer mediaServer = mediaServerService.getOne(mediaServerId); - if (mediaServer == null) { - throw new ControllerException(ErrorCode.ERROR100.getCode(), "未找到流媒体: " + mediaServerId); - } - mediaServers.add(mediaServer); - } else { - mediaServers = mediaServerService.getAll(); - } - if (mediaServers.isEmpty()) { - throw new ControllerException(ErrorCode.ERROR100.getCode(), "当前无流媒体"); - } - if (query != null && org.apache.commons.lang3.ObjectUtils.isEmpty(query.trim())) { - query = null; - } - if (app != null && org.apache.commons.lang3.ObjectUtils.isEmpty(app.trim())) { + if (app != null && ObjectUtils.isEmpty(app.trim())) { app = null; } - if (stream != null && org.apache.commons.lang3.ObjectUtils.isEmpty(stream.trim())) { + if (stream != null && ObjectUtils.isEmpty(stream.trim())) { stream = null; } - if (startTime != null && org.apache.commons.lang3.ObjectUtils.isEmpty(startTime.trim())) { - startTime = null; - } - if (endTime != null && org.apache.commons.lang3.ObjectUtils.isEmpty(endTime.trim())) { - endTime = null; - } - if (callId != null && org.apache.commons.lang3.ObjectUtils.isEmpty(callId.trim())) { + if (callId != null && ObjectUtils.isEmpty(callId.trim())) { callId = null; } + // 设置响应头 + response.setContentType("application/zip"); + response.setCharacterEncoding("UTF-8"); if (stream != null && callId != null) { response.addHeader("Content-Disposition", "attachment;filename=" + stream + "_" + callId + ".zip"); } - List cloudRecordItemList = cloudRecordService.getAllList(query, app, stream, startTime, endTime, mediaServers, callId, ids); - if (org.apache.commons.lang3.ObjectUtils.isEmpty(cloudRecordItemList)) { + List cloudRecordItemList = cloudRecordService.getUrlList(app, stream, callId); + if (ObjectUtils.isEmpty(cloudRecordItemList)) { + log.warn("[下载指定录像文件的压缩包] 未找到录像文件,app->{}, stream->{}, callId->{}", app, stream, callId); return; } - try { - ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()); - for (CloudRecordItem cloudRecordItem : cloudRecordItemList) { - zos.putNextEntry(new ZipEntry(DateUtil.timestampMsToUrlToyyyy_MM_dd_HH_mm_ss((long)cloudRecordItem.getStartTime()) + ".mp4")); - File file = new File(cloudRecordItem.getFilePath()); - if (!file.exists() || file.isDirectory()) { - continue; + + try (ZipOutputStream zos = new ZipOutputStream(response.getOutputStream())) { + for (CloudRecordUrl recordUrl : cloudRecordItemList) { + try { + zos.putNextEntry(new ZipEntry(recordUrl.getFileName())); + boolean downloadSuccess = HttpUtils.downLoadFile(recordUrl.getDownloadUrl(), zos); + if (!downloadSuccess) { + log.warn("[下载指定录像文件的压缩包] 下载文件失败: {}", recordUrl.getDownloadUrl()); + zos.closeEntry(); + continue; + } + zos.closeEntry(); + } catch (Exception e) { + log.error("[下载指定录像文件的压缩包] 处理文件失败: {}, 错误: {}", recordUrl.getFileName(), e.getMessage()); + // 继续处理下一个文件 } - FileInputStream fis = new FileInputStream(cloudRecordItem.getFilePath()); - byte[] buf = new byte[2 * 1024]; - int len; - while ((len = fis.read(buf)) != -1) { - zos.write(buf, 0, len); - } - zos.closeEntry(); - fis.close(); } - zos.close(); } catch (IOException e) { - log.error("[下载指定录像文件的压缩包] 失败: 查询 app->{}, stream->{}, mediaServerId->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, startTime, endTime, callId, e); + log.error("[下载指定录像文件的压缩包] 创建压缩包失败,查询 app->{}, stream->{}, callId->{}", app, stream, callId, e); } } @@ -498,7 +475,7 @@ public class CameraChannelController { log.info("[云端录像] 查询URL app->{}, stream->{}, mediaServerId->{}, page->{}, count->{}, startTime->{}, endTime->{}, callId->{}", app, stream, mediaServerId, page, count, startTime, endTime, callId); List mediaServers; - if (!org.apache.commons.lang3.ObjectUtils.isEmpty(mediaServerId)) { + if (!ObjectUtils.isEmpty(mediaServerId)) { mediaServers = new ArrayList<>(); MediaServer mediaServer = mediaServerService.getOne(mediaServerId); if (mediaServer == null) { @@ -508,22 +485,22 @@ public class CameraChannelController { } else { mediaServers = null; } - if (query != null && org.apache.commons.lang3.ObjectUtils.isEmpty(query.trim())) { + if (query != null && ObjectUtils.isEmpty(query.trim())) { query = null; } - if (app != null && org.apache.commons.lang3.ObjectUtils.isEmpty(app.trim())) { + if (app != null && ObjectUtils.isEmpty(app.trim())) { app = null; } - if (stream != null && org.apache.commons.lang3.ObjectUtils.isEmpty(stream.trim())) { + if (stream != null && ObjectUtils.isEmpty(stream.trim())) { stream = null; } - if (startTime != null && org.apache.commons.lang3.ObjectUtils.isEmpty(startTime.trim())) { + if (startTime != null && ObjectUtils.isEmpty(startTime.trim())) { startTime = null; } - if (endTime != null && org.apache.commons.lang3.ObjectUtils.isEmpty(endTime.trim())) { + if (endTime != null && ObjectUtils.isEmpty(endTime.trim())) { endTime = null; } - if (callId != null && org.apache.commons.lang3.ObjectUtils.isEmpty(callId.trim())) { + if (callId != null && ObjectUtils.isEmpty(callId.trim())) { callId = null; } MediaServer mediaServer = mediaServerService.getDefaultMediaServer(); @@ -535,7 +512,7 @@ public class CameraChannelController { } PageInfo cloudRecordItemPageInfo = cloudRecordService.getList(page, count, query, app, stream, startTime, endTime, mediaServers, callId, null); PageInfo cloudRecordUrlPageInfo = new PageInfo<>(); - if (!org.apache.commons.lang3.ObjectUtils.isEmpty(cloudRecordItemPageInfo)) { + if (!ObjectUtils.isEmpty(cloudRecordItemPageInfo)) { cloudRecordUrlPageInfo.setPageNum(cloudRecordItemPageInfo.getPageNum()); cloudRecordUrlPageInfo.setPageSize(cloudRecordItemPageInfo.getPageSize()); cloudRecordUrlPageInfo.setSize(cloudRecordItemPageInfo.getSize()); diff --git a/src/main/java/com/genersoft/iot/vmp/web/custom/conf/CachedBodyHttpServletRequest.java b/src/main/java/com/genersoft/iot/vmp/web/custom/conf/CachedBodyHttpServletRequest.java index 50a294de8..824745cda 100644 --- a/src/main/java/com/genersoft/iot/vmp/web/custom/conf/CachedBodyHttpServletRequest.java +++ b/src/main/java/com/genersoft/iot/vmp/web/custom/conf/CachedBodyHttpServletRequest.java @@ -120,3 +120,4 @@ public class CachedBodyHttpServletRequest extends HttpServletRequestWrapper { } } } + diff --git a/web/src/api/cloudRecord.js b/web/src/api/cloudRecord.js index 63e0795b0..4c3f7859b 100644 --- a/web/src/api/cloudRecord.js +++ b/web/src/api/cloudRecord.js @@ -110,7 +110,7 @@ export function deleteRecord(ids) { } export function queryList(params) { - const { app, stream, query, startTime, endTime, mediaServerId, page, count, ascOrder } = params + const { app, stream, query, callId, startTime, endTime, mediaServerId, page, count, ascOrder } = params return request({ method: 'get', url: `/api/cloud/record/list`, @@ -118,6 +118,7 @@ export function queryList(params) { app: app, stream: stream, query: query, + callId: callId, startTime: startTime, endTime: endTime, mediaServerId: mediaServerId, diff --git a/web/src/views/cloudRecord/index.vue b/web/src/views/cloudRecord/index.vue index 1d19ceca9..8a66c971a 100755 --- a/web/src/views/cloudRecord/index.vue +++ b/web/src/views/cloudRecord/index.vue @@ -12,11 +12,22 @@ @input="initData" /> + + + @@ -56,6 +68,14 @@ @click="deleteRecord" >移除 + 下载 + @@ -68,7 +88,8 @@ width="55" /> - + +