diff --git a/src/main/java/com/genersoft/iot/vmp/conf/CloudRecordTimer.java b/src/main/java/com/genersoft/iot/vmp/conf/CloudRecordTimer.java index 652853bb0..cf4fff31c 100644 --- a/src/main/java/com/genersoft/iot/vmp/conf/CloudRecordTimer.java +++ b/src/main/java/com/genersoft/iot/vmp/conf/CloudRecordTimer.java @@ -1,6 +1,7 @@ package com.genersoft.iot.vmp.conf; +import com.genersoft.iot.vmp.conf.exception.ControllerException; import com.genersoft.iot.vmp.media.bean.MediaServer; import com.genersoft.iot.vmp.media.service.IMediaServerService; import com.genersoft.iot.vmp.service.bean.CloudRecordItem; @@ -59,11 +60,14 @@ public class CloudRecordTimer { // TODO 后续可以删除空了的过期日期文件夹 for (CloudRecordItem cloudRecordItem : cloudRecordItemList) { String date = new File(cloudRecordItem.getFilePath()).getParentFile().getName(); - boolean deleteResult = mediaServerService.deleteRecordDirectory(mediaServerItem, cloudRecordItem.getApp(), - cloudRecordItem.getStream(), date, cloudRecordItem.getFileName()); - if (deleteResult) { - log.warn("[录像文件定时清理] 删除磁盘文件成功: {}", cloudRecordItem.getFilePath()); - } + try { + boolean deleteResult = mediaServerService.deleteRecordDirectory(mediaServerItem, cloudRecordItem.getApp(), + cloudRecordItem.getStream(), date, cloudRecordItem.getFileName()); + if (deleteResult) { + log.warn("[录像文件定时清理] 删除磁盘文件成功: {}", cloudRecordItem.getFilePath()); + } + }catch (ControllerException ignored) {} + } result += cloudRecordServiceMapper.deleteList(cloudRecordItemList); } diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaNodeServerService.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaNodeServerService.java index 87179d5da..69814c2bb 100644 --- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaNodeServerService.java +++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMMediaNodeServerService.java @@ -169,7 +169,7 @@ public class ZLMMediaNodeServerService implements IMediaNodeServerService { return true; }else { log.info("[zlm-deleteRecordDirectory] 删除磁盘文件错误, server: {} {}:{}->{}/{}, 结果: {}", mediaServer.getId(), app, stream, date, fileName, jsonObject); - return false; + throw new ControllerException(ErrorCode.ERROR100.getCode(), "删除磁盘文件失败"); } } 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 9486f62dc..39c3f2cc8 100755 --- a/src/main/java/com/genersoft/iot/vmp/service/ICloudRecordService.java +++ b/src/main/java/com/genersoft/iot/vmp/service/ICloudRecordService.java @@ -9,6 +9,7 @@ import com.genersoft.iot.vmp.service.bean.ErrorCallback; import com.github.pagehelper.PageInfo; import java.util.List; +import java.util.Set; /** * 云端录像管理 @@ -64,4 +65,5 @@ public interface ICloudRecordService { void setRecordSpeed(String mediaServerId, String app, String stream, Integer speed); + void deleteFileByIds(Set ids); } 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 e34e33b11..1acb6dbb7 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 @@ -34,12 +34,10 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.util.Assert; +import java.io.File; import java.time.LocalDate; import java.time.ZoneOffset; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; @Slf4j @Service @@ -337,4 +335,40 @@ public class CloudRecordServiceImpl implements ICloudRecordService { } mediaServerService.setRecordSpeed(mediaServer, app, stream, speed); } + + @Override + public void deleteFileByIds(Set ids) { + log.info("[删除录像文件] ids: {}", ids.toArray()); + List cloudRecordItemList = cloudRecordServiceMapper.queryRecordByIds(ids); + if (cloudRecordItemList.isEmpty()) { + return; + } + List cloudRecordItemIdListForDelete = new ArrayList<>(); + StringBuilder stringBuilder = new StringBuilder(); + for (CloudRecordItem cloudRecordItem : cloudRecordItemList) { + String date = new File(cloudRecordItem.getFilePath()).getParentFile().getName(); + MediaServer mediaServer = mediaServerService.getOne(cloudRecordItem.getMediaServerId()); + try { + boolean deleteResult = mediaServerService.deleteRecordDirectory(mediaServer, cloudRecordItem.getApp(), + cloudRecordItem.getStream(), date, cloudRecordItem.getFileName()); + if (deleteResult) { + log.warn("[录像文件定时清理] 删除磁盘文件成功: {}", cloudRecordItem.getFilePath()); + cloudRecordItemIdListForDelete.add(cloudRecordItem); + } + }catch (ControllerException e) { + if (stringBuilder.length() > 0) { + stringBuilder.append(", "); + } + stringBuilder.append(cloudRecordItem.getFileName()); + } + + } + if (!cloudRecordItemIdListForDelete.isEmpty()) { + cloudRecordServiceMapper.deleteList(cloudRecordItemIdListForDelete); + } + if (stringBuilder.length() > 0) { + stringBuilder.append(" 删除失败"); + throw new ControllerException(ErrorCode.ERROR100.getCode(), stringBuilder.toString()); + } + } } 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 062710832..87ac2059d 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 @@ -5,6 +5,7 @@ import com.genersoft.iot.vmp.service.bean.CloudRecordItem; import org.apache.ibatis.annotations.*; import java.util.List; +import java.util.Set; @Mapper public interface CloudRecordServiceMapper { @@ -140,4 +141,11 @@ public interface CloudRecordServiceMapper { @Param("stream") String stream, @Param("startTimeStamp")Long startTimeStamp, @Param("endTimeStamp")Long endTimeStamp); + + @Select(" ") + List queryRecordByIds(Set ids); } 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 198a5a19c..b9485c095 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 @@ -12,6 +12,7 @@ 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.service.bean.InviteErrorCode; +import com.genersoft.iot.vmp.streamPush.bean.BatchRemoveParam; import com.genersoft.iot.vmp.utils.DateUtil; import com.genersoft.iot.vmp.vmanager.bean.ErrorCode; import com.genersoft.iot.vmp.vmanager.bean.StreamContent; @@ -339,6 +340,14 @@ public class CloudRecordController { cloudRecordService.setRecordSpeed(mediaServerId, app, stream, speed); } + @ResponseBody + @DeleteMapping("/delete") + @Operation(summary = "删除录像文件") + @Parameter(name = "ids", description = "文件ID集合", required = true) + public void deleteFileByIds(@RequestBody BatchRemoveParam ids) { + cloudRecordService.deleteFileByIds(ids.getIds()); + } + /************************* 以下这些接口只适合wvp和zlm部署在同一台服务器的情况,且wvp只有一个zlm节点的情况 ***************************************/ /**