修改:本地录像以用户id和相机id作为唯一标识录制
增加:定时删除非当日本地录像缓存文件 周期:10分钟
已修改5个文件
76 ■■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/camera/service/impl/ArdCamerasServiceImpl.java
@@ -1,5 +1,7 @@
package com.ruoyi.device.camera.service.impl;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
@@ -38,6 +40,7 @@
import com.ruoyi.utils.gis.Point;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
@@ -71,7 +74,7 @@
    @PostConstruct
    public void loadCameras() {
        //清除录像缓存
        //清理本地录像缓存文件
        String tempPath = ARDConfig.getProfile() + Constants.LOCAL_RECORD_TEMP_PREFIX;
        FileUtils.deleteFolder(tempPath);
        //清空相机缓存
@@ -86,6 +89,22 @@
    }
    /**
     * @Author 刘苏义
     * @Description 定时清理本地录像缓存文件(超过1天)
     * @Date   2024/6/21 8:13
     * @Param
     * @return
     */
    @Scheduled(cron = "0 0/10 * * * ?")
    public void clearRecordTemp()
    {
        log.debug("定时清理本地录像缓存文件(超过1天)");
        String tempPath = ARDConfig.getProfile() + Constants.LOCAL_RECORD_TEMP_PREFIX;
        Path folderPath = Paths.get(tempPath);
        FileUtils.deleteNonTodayFiles(folderPath);
    }
    /**
     * 设置cache key
     *
     * @param configKey 参数键
ard-work/src/main/java/com/ruoyi/utils/sdk/dhsdk/service/impl/DahuaSDK.java
@@ -557,6 +557,7 @@
    @Override
    public AjaxResult localRecordStart(CameraCmd cmd) {
        try {
            String operator = cmd.getOperator();
            String cameraId = cmd.getCameraId();
            Integer chanNo = cmd.getChanNo();
@@ -573,7 +574,7 @@
            // 本地临时录像地址
            String tempPath = ARDConfig.getProfile() + Constants.LOCAL_RECORD_TEMP_PREFIX;
            String path = FileUtils.createFile(tempPath + "/" + cameraId + ".mp4");
            String path = FileUtils.createFile(tempPath + "/" + operator + "/" + cameraId + ".mp4");
            LLong lRealHandle = RealPlayModule.startRealPlay(loginId, chanNo - 1, path);
            if (lRealHandle.longValue() <= 0) {
                log.error("取流失败" + getErrorCodePrint());
@@ -597,6 +598,7 @@
    @Override
    public AjaxResult localRecordStop(CameraCmd cmd) {
        try {
            String operator = cmd.getOperator();
            String cameraId = cmd.getCameraId();
            LLong lRealHandle = new LLong(cmd.getRecordId());
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
@@ -606,7 +608,7 @@
            log.debug("本地录像停止");
            // 本地临时录像地址
            String tempPath = ARDConfig.getProfile() + Constants.LOCAL_RECORD_TEMP_PREFIX;
            String recordPath = FileUtils.createFile(tempPath + "/" + cameraId + ".mp4");
            String recordPath = FileUtils.createFile(tempPath + "/" + operator + "/" + cameraId + ".mp4");
            byte[] imageBytes = Files.readAllBytes(Paths.get(recordPath));
            return AjaxResult.success(imageBytes);
        } catch (Exception ex) {
ard-work/src/main/java/com/ruoyi/utils/sdk/hiksdk/service/impl/HikvisionSDK.java
@@ -1939,11 +1939,12 @@
    @Override
    public AjaxResult localRecordStart(CameraCmd cmd) {
        try {
            String operator = cmd.getOperator();
            String cameraId = cmd.getCameraId();
            Integer channelNum = cmd.getChanNo();
            // 本地临时录像地址
            String tempPath = ARDConfig.getProfile() + Constants.LOCAL_RECORD_TEMP_PREFIX;
            String path = FileUtils.createFile(tempPath + "/" + cameraId + ".mp4");
            String path = FileUtils.createFile(tempPath + "/" + operator + "/" + cameraId + ".mp4");
            if (!GlobalVariable.loginMap.containsKey(cameraId)) {
                return AjaxResult.warn("设备未登录");
            }
@@ -2000,6 +2001,7 @@
    @Override
    public AjaxResult localRecordStop(CameraCmd cmd) {
        try {
            String operator = cmd.getOperator();
            String cameraId = cmd.getCameraId();
            Integer channelNum = cmd.getChanNo();
            Integer lRealHandle = cmd.getRecordId().intValue();
@@ -2034,7 +2036,7 @@
            log.debug("本地录像停止");
            // 本地临时录像地址
            String tempPath = ARDConfig.getProfile() + Constants.LOCAL_RECORD_TEMP_PREFIX;
            String recordPath = FileUtils.createFile(tempPath + "/" + cameraId + ".mp4");
            String recordPath = FileUtils.createFile(tempPath + "/" + operator + "/" + cameraId + ".mp4");
            byte[] recordBytes = Files.readAllBytes(Paths.get(recordPath));
            return AjaxResult.success(recordBytes);
        } catch (Exception ex) {
ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -4,6 +4,7 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
@@ -13,6 +14,7 @@
 */
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class },scanBasePackages = {"com.ruoyi"})
@ForestScan("com.ruoyi.utils.forest")
@EnableScheduling
public class RuoYiApplication
{
    public static void main(String[] args)
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
@@ -9,6 +9,13 @@
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.time.LocalDate;
import java.time.ZoneId;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -287,4 +294,38 @@
            return "";
        }
    }
    /**
     * @Author 刘苏义
     * @Description  删除今天之前的文件
     * @Date   2024/6/21 8:42
     * @Param
     * @return
     */
    public static void deleteNonTodayFiles(Path folderPath) {
        try {
            Files.walkFileTree(folderPath, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                    LocalDate fileDate = attrs.creationTime().toInstant()
                            .atZone(ZoneId.systemDefault()).toLocalDate();
                    LocalDate today = LocalDate.now();
                    if (!fileDate.equals(today)) {
                        Files.delete(file);
                        System.out.println("Deleted: " + file.toString());
                    }
                    return FileVisitResult.CONTINUE;
                }
                @Override
                public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
                    System.err.println("Failed to access file: " + file.toString());
                    return FileVisitResult.CONTINUE;
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}