‘liusuyi’
2023-06-03 c6ef8fb06f8f75ece7e4d6669af01bebb051d217
优化巡检
已添加1个文件
已修改6个文件
266 ■■■■■ 文件已修改
ard-work/src/main/java/com/ruoyi/constant/Global.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTaskManager.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/mapper/inspect/ArdVideoInspectRecordMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/resources/mapper/inspect/ArdVideoInspectTaskMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java 158 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ard-work/src/main/java/com/ruoyi/constant/Global.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.constant;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * @Description: å…¨å±€ç±»
 * @ClassName: Global
 * @Author: åˆ˜è‹ä¹‰
 * @Date: 2023å¹´06月03日10:30
 * @Version: 1.0
 **/
public class Global {
    public static List<String> task_record=new ArrayList<>();
}
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
@@ -5,6 +5,7 @@
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.constant.sdkPriority;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.mapper.ArdCamerasMapper;
@@ -1302,15 +1303,13 @@
                return;
            }
            Integer userId = GlobalVariable.loginMap.get(cameraId);
            String path = "";
            //强制I帧结构体对象
            HCNetSDK.NET_DVR_I_FRAME netDvrIFrame = new HCNetSDK.NET_DVR_I_FRAME();   //新建结构体对象
            netDvrIFrame.read();
            netDvrIFrame.dwChannel = channelNum;          //因为上文代码中设置了通道号,按照上文中的设置
            netDvrIFrame.dwChannel = channelNum;//因为上文代码中设置了通道号,按照上文中的设置
            netDvrIFrame.byStreamType = 0;
            netDvrIFrame.dwSize = netDvrIFrame.size();
            netDvrIFrame.write();
            if(!hCNetSDK.NET_DVR_RemoteControl(userId,3402,netDvrIFrame.getPointer(),netDvrIFrame.dwSize)){
                log.error("强制I帧 é”™è¯¯ç ä¸º:  " + hCNetSDK.NET_DVR_GetLastError());
            }
@@ -1333,15 +1332,8 @@
                        return;
                    }
                    log.info("取流成功");
                    File file = new File("D:/recordTemp/" + cameraId + ".mp4");
                    if (!file.exists()) {
                        File fileParent = file.getParentFile();
                        if (!fileParent.exists()) {
                            fileParent.mkdirs();
                        }
                        file.createNewFile();
                    }
                    path = file.getCanonicalPath();
                    String path= FileUtils.createFile("D:/recordTemp/" + cameraId + ".mp4");
                    recordInfo info = new recordInfo();
                    info.setLRealHandle(lRealHandle);
                    info.setRecordPath(path);
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java
@@ -5,6 +5,7 @@
import com.ruoyi.alarmpoints.well.domain.ArdAlarmpointsWell;
import com.ruoyi.alarmpoints.well.mapper.ArdAlarmpointsWellMapper;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.constant.Global;
import com.ruoyi.device.camera.domain.ArdCameras;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.camera.mapper.ArdCamerasMapper;
@@ -13,6 +14,7 @@
import com.ruoyi.inspect.domain.ArdVideoInspectRecord;
import com.ruoyi.inspect.mapper.ArdVideoInspectRecordMapper;
import com.ruoyi.inspect.mapper.ArdVideoInspectTaskStepMapper;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import com.ruoyi.common.utils.StringUtils;
@@ -51,12 +53,14 @@
    @PostConstruct
    public void initTask() {
        List<ArdVideoInspectTask> ardVideoInspectTasks = ardVideoInspectTaskMapper.selectArdVideoInspectTaskList(new ArdVideoInspectTask());
        /*启动后将所有手动任务置为关闭*/
        for (ArdVideoInspectTask ardVideoInspectTask : ardVideoInspectTasks) {
            /*启动后将所有手动任务置为关闭,所有任务当前步骤信息清空*/
            if (ardVideoInspectTask.getInspectMode().equals("手动")) {
                ardVideoInspectTask.setMenualSwitch("关");
                ardVideoInspectTaskMapper.updateArdVideoInspectTask(ardVideoInspectTask);
            }
            ardVideoInspectTask.setCurrentStepId("");
            ardVideoInspectTask.setCurrentStepStartTime("");
            ardVideoInspectTaskMapper.updateArdVideoInspectTask(ardVideoInspectTask);
        }
    }
@@ -325,6 +329,22 @@
                        }
                    }
                } else {
                    if(Global.task_record.contains(videoInspectTask.getId()))
                    {
                        /*停止录像*/
                        CameraCmd cmd = new CameraCmd();
                        cmd.setCameraId(videoInspectTask.getCameraId());
                        cmd.setChannelNum(videoInspectTask.getChannel());
                        cmd.setOperator("sys_patrol_inspect");
                        cmd.setEnable(false);//停止录像
                        String uuid = UUID.randomUUID().toString().replace("-", "");
                        String time = new SimpleDateFormat("yyyyMMdd").format(new Date());
                        String recordName = videoInspectTask.getCameraId() + "/" + time + "/" + uuid + ".mp4";
                        cmd.setRecordBucketName("record");
                        cmd.setRecordObjectName(recordName);
                        cmd.setUploadMinio(true);
                        hikClientService.recordToMinio(cmd);
                    }
                    if (StringUtils.isEmpty(videoInspectTask.getCurrentStepId()) || StringUtils.isEmpty(videoInspectTask.getCurrentStepStartTime())) {
                        continue;
                    }
@@ -429,25 +449,24 @@
                    cmd.setExpired(step.getRecordingTime());
                    boolean setTargetPosition = hikClientService.setTargetPosition(cmd);
                    if (setTargetPosition) {
                        /*控制相机巡检成功,开始录像*/
                        cmd.setEnable(true);//启动录像
                        hikClientService.recordToMinio(cmd);
                        if(!Global.task_record.contains(ardVideoInspectTask.getId()))
                        {
                            /*控制相机巡检成功,开始录像*/
                            cmd.setEnable(true);//启动录像
                            hikClientService.recordToMinio(cmd);
                            Global.task_record.add(ardVideoInspectTask.getId());
                        }
                        /*更新任务当前步骤id和步骤启动时间*/
                        ArdVideoInspectTask avit = new ArdVideoInspectTask();
                        avit.setId(ardVideoInspectTask.getId());
                        avit.setCurrentStepId(step.getId());
                        avit.setCurrentStepStartTime(DateUtils.getTime());
                        ardVideoInspectTaskMapper.updateArdVideoInspectTask(avit);
                        ardVideoInspectTask.setCurrentStepId(step.getId());
                        ardVideoInspectTask.setCurrentStepStartTime(DateUtils.getTime());
                        ardVideoInspectTaskMapper.updateArdVideoInspectTask(ardVideoInspectTask);
                    } else {
                        cmd.setEnable(false);//停止录像
                        cmd.setUploadMinio(true);
                        hikClientService.recordToMinio(cmd);
                        /*控制失败,当前步骤启动时间置null*/
                        ArdVideoInspectTask avit = new ArdVideoInspectTask();
                        avit.setId(ardVideoInspectTask.getId());
                        avit.setCurrentStepId(step.getId());
                        avit.setCurrentStepStartTime("");
                        ardVideoInspectTaskMapper.updateArdVideoInspectTask(avit);
                        ardVideoInspectTask.setCurrentStepStartTime("");
                        ardVideoInspectTaskMapper.updateArdVideoInspectTask(ardVideoInspectTask);
                    }
                }
            }
@@ -455,7 +474,6 @@
            log.error("巡检开始异常:" + ex.getMessage());
        }
    }
    //步骤停止
    private void stopRunStep(ArdVideoInspectTask ardVideoInspectTask) {
        try {
@@ -486,6 +504,7 @@
                cmd.setRecordObjectName(recordName);
                cmd.setUploadMinio(true);
                hikClientService.recordToMinio(cmd);
                Global.task_record.remove(ardVideoInspectTask.getId());
                /*插入巡检记录*/
                ArdVideoInspectRecord ardVideoInspectRecord = new ArdVideoInspectRecord();
                ardVideoInspectRecord.setStepId(step.getId());
@@ -603,4 +622,4 @@
        return timeList;
    }
}
}
ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTaskManager.java
@@ -1,5 +1,6 @@
package com.ruoyi.inspect.service.impl;
import com.ruoyi.constant.Global;
import com.ruoyi.device.camera.domain.CameraCmd;
import com.ruoyi.device.hiksdk.common.GlobalVariable;
import com.ruoyi.device.hiksdk.service.IHikClientService;
@@ -53,7 +54,21 @@
        ardVideoInspectTask.setCurrentStepId("");
        ardVideoInspectTask.setCurrentStepStartTime("");
        ardVideoInspectTaskMapper.updateArdVideoInspectTask(ardVideoInspectTask);
        /*将关联的相机录像关闭*/
        if( Global.task_record.contains(taskId))
        {
//            Integer userId = GlobalVariable.loginMap.get(ardVideoInspectTask.getCameraId());//获取当前相机的登录ID
//            if( GlobalVariable.user_real_Map.containsKey(userId))
//            {   //当前相机正在录像,则停止录像
//                CameraCmd cmd = new CameraCmd();
//                cmd.setCameraId(ardVideoInspectTask.getCameraId());
//                cmd.setChannelNum(ardVideoInspectTask.getChannel());
//                cmd.setEnable(false);//停止录像
//                cmd.setUploadMinio(false);
//                hikClientService.recordToMinio(cmd);
//            }
            Global.task_record.remove(taskId);
        }
        InspectionTask task = new InspectionTask(taskId);
        task.start();
        taskMap.put(taskId, task);
@@ -76,6 +91,7 @@
            cmd.setEnable(false);//停止录像
            cmd.setUploadMinio(false);
            hikClientService.recordToMinio(cmd);
            GlobalVariable.user_real_Map.remove(userId);
        }
        InspectionTask task = taskMap.get(taskId);
        if (task != null) {
ard-work/src/main/resources/mapper/inspect/ArdVideoInspectRecordMapper.xml
@@ -33,6 +33,7 @@
    <select id="selectArdVideoInspectRecordListByStartTime" parameterType="ArdVideoInspectRecord" resultType="java.util.HashMap">
        select r.*,s.well_id,w.well_id as well_name from ard_video_inspect_record r ,ard_video_inspect_task_step
        s,ard_alarmpoints_well w where start_time like ('${startTime}%') and r.step_id = s.id and s.well_id = w.id
        order by start_time desc
    </select>
    <!--按月份统计文件数量-->
    <select id="selectArdVideoInspectRecordCountByStartMonth" parameterType="String" resultType="java.util.HashMap">
ard-work/src/main/resources/mapper/inspect/ArdVideoInspectTaskMapper.xml
@@ -51,7 +51,7 @@
            <if test="cameraId != null  and cameraId != ''"> and camera_id = #{cameraId}</if>
            <if test="channel != null "> and channel = #{channel}</if>
        </where>
        order by id
        order by start_time
    </select>
    
    <select id="selectArdVideoInspectTaskById" parameterType="String" resultMap="ArdVideoInspectTaskArdVideoInspectTaskStepResult">
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
@@ -11,6 +11,7 @@
import java.nio.charset.StandardCharsets;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
import com.ruoyi.common.config.ARDConfig;
@@ -21,44 +22,35 @@
/**
 * æ–‡ä»¶å¤„理工具类
 *
 *
 * @author ruoyi
 */
public class FileUtils
{
public class FileUtils {
    public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
    /**
     * è¾“出指定文件的byte数组
     *
     *
     * @param filePath æ–‡ä»¶è·¯å¾„
     * @param os è¾“出流
     * @param os       è¾“出流
     * @return
     */
    public static void writeBytes(String filePath, OutputStream os) throws IOException
    {
    public static void writeBytes(String filePath, OutputStream os) throws IOException {
        FileInputStream fis = null;
        try
        {
        try {
            File file = new File(filePath);
            if (!file.exists())
            {
            if (!file.exists()) {
                throw new FileNotFoundException(filePath);
            }
            fis = new FileInputStream(file);
            byte[] b = new byte[1024];
            int length;
            while ((length = fis.read(b)) > 0)
            {
            while ((length = fis.read(b)) > 0) {
                os.write(b, 0, length);
            }
        }
        catch (IOException e)
        {
        } catch (IOException e) {
            throw e;
        }
        finally
        {
        } finally {
            IOUtils.close(os);
            IOUtils.close(fis);
        }
@@ -71,33 +63,28 @@
     * @return ç›®æ ‡æ–‡ä»¶
     * @throws IOException IO异常
     */
    public static String writeImportBytes(byte[] data) throws IOException
    {
    public static String writeImportBytes(byte[] data) throws IOException {
        return writeBytes(data, ARDConfig.getImportPath());
    }
    /**
     * å†™æ•°æ®åˆ°æ–‡ä»¶ä¸­
     *
     * @param data æ•°æ®
     * @param data      æ•°æ®
     * @param uploadDir ç›®æ ‡æ–‡ä»¶
     * @return ç›®æ ‡æ–‡ä»¶
     * @throws IOException IO异常
     */
    public static String writeBytes(byte[] data, String uploadDir) throws IOException
    {
    public static String writeBytes(byte[] data, String uploadDir) throws IOException {
        FileOutputStream fos = null;
        String pathName = "";
        try
        {
        try {
            String extension = getFileExtendName(data);
            pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;
            File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName);
            fos = new FileOutputStream(file);
            fos.write(data);
        }
        finally
        {
        } finally {
            IOUtils.close(fos);
        }
        return FileUploadUtils.getPathFileName(uploadDir, pathName);
@@ -105,17 +92,15 @@
    /**
     * åˆ é™¤æ–‡ä»¶
     *
     *
     * @param filePath æ–‡ä»¶
     * @return
     */
    public static boolean deleteFile(String filePath)
    {
    public static boolean deleteFile(String filePath) {
        boolean flag = false;
        File file = new File(filePath);
        // è·¯å¾„为文件且不为空则进行删除
        if (file.isFile() && file.exists())
        {
        if (file.isFile() && file.exists()) {
            flag = file.delete();
        }
        return flag;
@@ -123,32 +108,28 @@
    /**
     * æ–‡ä»¶åç§°éªŒè¯
     *
     *
     * @param filename æ–‡ä»¶åç§°
     * @return true æ­£å¸¸ false éžæ³•
     */
    public static boolean isValidFilename(String filename)
    {
    public static boolean isValidFilename(String filename) {
        return filename.matches(FILENAME_PATTERN);
    }
    /**
     * æ£€æŸ¥æ–‡ä»¶æ˜¯å¦å¯ä¸‹è½½
     *
     *
     * @param resource éœ€è¦ä¸‹è½½çš„æ–‡ä»¶
     * @return true æ­£å¸¸ false éžæ³•
     */
    public static boolean checkAllowDownload(String resource)
    {
    public static boolean checkAllowDownload(String resource) {
        // ç¦æ­¢ç›®å½•上跳级别
        if (StringUtils.contains(resource, ".."))
        {
        if (StringUtils.contains(resource, "..")) {
            return false;
        }
        // æ£€æŸ¥å…è®¸ä¸‹è½½çš„æ–‡ä»¶è§„则
        if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource)))
        {
        if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource))) {
            return true;
        }
@@ -158,33 +139,25 @@
    /**
     * ä¸‹è½½æ–‡ä»¶åé‡æ–°ç¼–码
     *
     * @param request è¯·æ±‚对象
     *
     * @param request  è¯·æ±‚对象
     * @param fileName æ–‡ä»¶å
     * @return ç¼–码后的文件名
     */
    public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException
    {
    public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException {
        final String agent = request.getHeader("USER-AGENT");
        String filename = fileName;
        if (agent.contains("MSIE"))
        {
        if (agent.contains("MSIE")) {
            // IE浏览器
            filename = URLEncoder.encode(filename, "utf-8");
            filename = filename.replace("+", " ");
        }
        else if (agent.contains("Firefox"))
        {
        } else if (agent.contains("Firefox")) {
            // ç«ç‹æµè§ˆå™¨
            filename = new String(fileName.getBytes(), "ISO8859-1");
        }
        else if (agent.contains("Chrome"))
        {
        } else if (agent.contains("Chrome")) {
            // google浏览器
            filename = URLEncoder.encode(filename, "utf-8");
        }
        else
        {
        } else {
            // å…¶å®ƒæµè§ˆå™¨
            filename = URLEncoder.encode(filename, "utf-8");
        }
@@ -194,11 +167,10 @@
    /**
     * ä¸‹è½½æ–‡ä»¶åé‡æ–°ç¼–码
     *
     * @param response å“åº”对象
     * @param response     å“åº”对象
     * @param realFileName çœŸå®žæ–‡ä»¶å
     */
    public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException
    {
    public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException {
        String percentEncodedFileName = percentEncode(realFileName);
        StringBuilder contentDispositionValue = new StringBuilder();
@@ -220,36 +192,27 @@
     * @param s éœ€è¦ç™¾åˆ†å·ç¼–码的字符串
     * @return ç™¾åˆ†å·ç¼–码后的字符串
     */
    public static String percentEncode(String s) throws UnsupportedEncodingException
    {
    public static String percentEncode(String s) throws UnsupportedEncodingException {
        String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
        return encode.replaceAll("\\+", "%20");
    }
    /**
     * èŽ·å–å›¾åƒåŽç¼€
     *
     *
     * @param photoByte å›¾åƒæ•°æ®
     * @return åŽç¼€å
     */
    public static String getFileExtendName(byte[] photoByte)
    {
    public static String getFileExtendName(byte[] photoByte) {
        String strFileExtendName = "jpg";
        if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
                && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97))
        {
                && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97)) {
            strFileExtendName = "gif";
        }
        else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70))
        {
        } else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70)) {
            strFileExtendName = "jpg";
        }
        else if ((photoByte[0] == 66) && (photoByte[1] == 77))
        {
        } else if ((photoByte[0] == 66) && (photoByte[1] == 77)) {
            strFileExtendName = "bmp";
        }
        else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71))
        {
        } else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71)) {
            strFileExtendName = "png";
        }
        return strFileExtendName;
@@ -257,14 +220,12 @@
    /**
     * èŽ·å–æ–‡ä»¶åç§° /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png
     *
     *
     * @param fileName è·¯å¾„名称
     * @return æ²¡æœ‰æ–‡ä»¶è·¯å¾„的名称
     */
    public static String getName(String fileName)
    {
        if (fileName == null)
        {
    public static String getName(String fileName) {
        if (fileName == null) {
            return null;
        }
        int lastUnixPos = fileName.lastIndexOf('/');
@@ -275,17 +236,38 @@
    /**
     * èŽ·å–ä¸å¸¦åŽç¼€æ–‡ä»¶åç§° /profile/upload/2022/04/16/ruoyi.png -- ruoyi
     *
     *
     * @param fileName è·¯å¾„名称
     * @return æ²¡æœ‰æ–‡ä»¶è·¯å¾„和后缀的名称
     */
    public static String getNameNotSuffix(String fileName)
    {
        if (fileName == null)
        {
    public static String getNameNotSuffix(String fileName) {
        if (fileName == null) {
            return null;
        }
        String baseName = FilenameUtils.getBaseName(fileName);
        return baseName;
    }
    /**
     * åˆ›å»ºä¸€ä¸ªæ–‡ä»¶èŽ·å–æ–‡ä»¶è·¯å¾„
     *
     * @param fileName è·¯å¾„名称
     * @return æ–‡ä»¶è·¯å¾„和后缀的名称
     */
    public static String createFile(String fileName) {
        try {
            File file = new File(fileName);
            if (!file.exists()) {
                File fileParent = file.getParentFile();
                if (!fileParent.exists()) {
                    fileParent.mkdirs();
                }
                file.createNewFile();
            }
            return file.getCanonicalPath();
        } catch (Exception ex) {
            return "";
        }
    }
}