From c6ef8fb06f8f75ece7e4d6669af01bebb051d217 Mon Sep 17 00:00:00 2001
From: ‘liusuyi’ <1951119284@qq.com>
Date: 周六, 03 6月 2023 17:20:56 +0800
Subject: [PATCH] 优化巡检
---
ard-work/src/main/java/com/ruoyi/constant/Global.java | 18 +++
ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java | 16 --
ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTaskManager.java | 18 +++
ard-work/src/main/resources/mapper/inspect/ArdVideoInspectTaskMapper.xml | 2
ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java | 158 ++++++++++++++-----------------
ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java | 53 +++++++---
ard-work/src/main/resources/mapper/inspect/ArdVideoInspectRecordMapper.xml | 1
7 files changed, 147 insertions(+), 119 deletions(-)
diff --git a/ard-work/src/main/java/com/ruoyi/constant/Global.java b/ard-work/src/main/java/com/ruoyi/constant/Global.java
new file mode 100644
index 0000000..dae57c1
--- /dev/null
+++ b/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<>();
+}
diff --git a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java b/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
index aaf30b3..0d5e498 100644
--- a/ard-work/src/main/java/com/ruoyi/device/hiksdk/service/impl/HikClientServiceImpl.java
+++ b/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);
diff --git a/ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java b/ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java
index aecf1ad..4116465 100644
--- a/ard-work/src/main/java/com/ruoyi/inspect/service/impl/ArdVideoInspectTaskServiceImpl.java
+++ b/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;
}
-}
+}
\ No newline at end of file
diff --git a/ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTaskManager.java b/ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTaskManager.java
index 9ee0e03..61ef513 100644
--- a/ard-work/src/main/java/com/ruoyi/inspect/service/impl/InspectionTaskManager.java
+++ b/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) {
diff --git a/ard-work/src/main/resources/mapper/inspect/ArdVideoInspectRecordMapper.xml b/ard-work/src/main/resources/mapper/inspect/ArdVideoInspectRecordMapper.xml
index fa00cca..33a95ee 100644
--- a/ard-work/src/main/resources/mapper/inspect/ArdVideoInspectRecordMapper.xml
+++ b/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">
diff --git a/ard-work/src/main/resources/mapper/inspect/ArdVideoInspectTaskMapper.xml b/ard-work/src/main/resources/mapper/inspect/ArdVideoInspectTaskMapper.xml
index 8b9dc65..8101ae7 100644
--- a/ard-work/src/main/resources/mapper/inspect/ArdVideoInspectTaskMapper.xml
+++ b/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">
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
index b9bc834..d2dcff2 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
+++ b/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 "";
+ }
+ }
}
--
Gitblit v1.9.3