|
@@ -17,15 +17,7 @@ import java.time.*;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.time.format.DateTimeParseException;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Calendar;
|
|
|
-import java.util.Date;
|
|
|
-import java.util.GregorianCalendar;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Set;
|
|
|
-import java.util.UUID;
|
|
|
+import java.util.*;
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
import java.util.concurrent.Executors;
|
|
|
import java.util.regex.Matcher;
|
|
@@ -44,6 +36,8 @@ import com.jcraft.jsch.JSch;
|
|
|
import com.jcraft.jsch.JSchException;
|
|
|
import com.jcraft.jsch.Session;
|
|
|
import com.ozs.common.utils.HttpClientUtil;
|
|
|
+import com.ozs.service.entity.*;
|
|
|
+import com.ozs.service.service.*;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
@@ -63,16 +57,6 @@ import com.ozs.common.utils.DateUtils;
|
|
|
import com.ozs.common.utils.http.HttpUtils;
|
|
|
import com.ozs.common.utils.uuid.IdUtils;
|
|
|
import com.ozs.framework.config.ServerConfig;
|
|
|
-import com.ozs.service.entity.BaseCameraManagement;
|
|
|
-import com.ozs.service.entity.BaseDeviceDynamicManagement;
|
|
|
-import com.ozs.service.entity.CameraLogDetail;
|
|
|
-import com.ozs.service.entity.MqLog;
|
|
|
-import com.ozs.service.entity.MsgAlarm;
|
|
|
-import com.ozs.service.service.BaseCameraManagementService;
|
|
|
-import com.ozs.service.service.BaseDeviceDynamicManagementService;
|
|
|
-import com.ozs.service.service.CameraLogDetailService;
|
|
|
-import com.ozs.service.service.MqLogService;
|
|
|
-import com.ozs.service.service.MsgAlarmService;
|
|
|
import com.ozs.system.mapper.SysDictDataMapper;
|
|
|
import com.ozs.web.core.config.CaneraConfig;
|
|
|
|
|
@@ -124,6 +108,8 @@ public class CameraUtil {
|
|
|
private ServerConfig serverConfig;
|
|
|
@Autowired
|
|
|
private MsgAlarmService msgAlarmService;
|
|
|
+ @Autowired
|
|
|
+ BaseDeviceResumeService baseDeviceResumeService;
|
|
|
|
|
|
@Resource
|
|
|
BaseCameraManagementService baseCameraManagementService;
|
|
@@ -189,7 +175,7 @@ public class CameraUtil {
|
|
|
return wsUrl + "/ws/" + channel + "/" + cameraCode;
|
|
|
}
|
|
|
if (!flay) {
|
|
|
- return webUrl + "/hdl/" + channel + "/" + cameraCode ;
|
|
|
+ return webUrl + "/hdl/" + channel + "/" + cameraCode;
|
|
|
}
|
|
|
return webUrl + "/hdl/" + channel + "/" + cameraCode;
|
|
|
}
|
|
@@ -535,14 +521,14 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
|
|
|
*/
|
|
|
public static String getRecordUrl(String cameraCode, String channel, Date startTm, Date endTm) {
|
|
|
String result = null;
|
|
|
- String url = bakUrl + "/gb28181/api/invite?id=" + cameraCode + "&channel=" + channel + "&startTime=" + startTm.getTime()/1000 + "&endTime=" + endTm.getTime()/1000;
|
|
|
+ String url = bakUrl + "/gb28181/api/invite?id=" + cameraCode + "&channel=" + channel + "&startTime=" + startTm.getTime() / 1000 + "&endTime=" + endTm.getTime() / 1000;
|
|
|
try {
|
|
|
result = HttpClientUtil.get(url);
|
|
|
if (result.equals("200")) {
|
|
|
- String path = apiSummary(cameraCode + "/" + channel+"/"+startTm.getTime()/1000+"-"+endTm.getTime()/1000);
|
|
|
- if (StringUtils.isNotEmpty(path)){
|
|
|
+ String path = apiSummary(cameraCode + "/" + channel + "/" + startTm.getTime() / 1000 + "-" + endTm.getTime() / 1000);
|
|
|
+ if (StringUtils.isNotEmpty(path)) {
|
|
|
return path;
|
|
|
- }else {
|
|
|
+ } else {
|
|
|
return "当前相机暂无回放视频";
|
|
|
}
|
|
|
}
|
|
@@ -1002,51 +988,73 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
|
|
|
* 相机状态修改
|
|
|
*/
|
|
|
public void cameraBlockUp() {
|
|
|
- long time=60000L;
|
|
|
+ long baseTime = 60000L;
|
|
|
//当前时间戳
|
|
|
- long dades = System.currentTimeMillis();
|
|
|
+ long currentTimestamp = System.currentTimeMillis();
|
|
|
//字典中设置的值
|
|
|
List<SysDictData> heartIntervalTime = dictDataMapper.selectDictDataByType("heart_interval_time");
|
|
|
List<SysDictData> triggerWarningFrequency = dictDataMapper.selectDictDataByType("trigger_warning_frequency");
|
|
|
- if (!ObjectUtils.isEmpty(heartIntervalTime)){
|
|
|
- time=time*Long.valueOf(heartIntervalTime.get(0).getDictValue());
|
|
|
+ // 计算时间间隔
|
|
|
+ long timeInterval = baseTime;
|
|
|
+ if (!ObjectUtils.isEmpty(heartIntervalTime)) {
|
|
|
+ timeInterval *= Long.valueOf(heartIntervalTime.get(0).getDictValue());
|
|
|
}
|
|
|
- if (!ObjectUtils.isEmpty(triggerWarningFrequency)){
|
|
|
- time=time*Long.valueOf(triggerWarningFrequency.get(0).getDictValue());
|
|
|
+ if (!ObjectUtils.isEmpty(triggerWarningFrequency)) {
|
|
|
+ timeInterval *= Long.valueOf(triggerWarningFrequency.get(0).getDictValue());
|
|
|
+ }
|
|
|
+ if (ObjectUtils.isEmpty(heartIntervalTime) || ObjectUtils.isEmpty(triggerWarningFrequency)) {
|
|
|
+ timeInterval = baseTime * 5 * 3; // 默认值
|
|
|
+ }
|
|
|
+ // 计算查询的时间范围(前五分钟)
|
|
|
+ long startTime = currentTimestamp - timeInterval;
|
|
|
+ // 查询 MQ 日志
|
|
|
+ LambdaQueryWrapper<MqLog> mqLogQuery = new LambdaQueryWrapper<>();
|
|
|
+ mqLogQuery.between(MqLog::getCreateTime, new Date(startTime), new Date(currentTimestamp));
|
|
|
+ List<MqLog> mqLogs = mqLogService.list(mqLogQuery);
|
|
|
+ Set<String> loggedCameraCodes = mqLogs.stream().map(MqLog::getCameraCode).collect(Collectors.toSet());
|
|
|
+ // 获取所有设备
|
|
|
+ List<BaseDeviceDynamicManagement> devices = baseDeviceDynamicManagementService.list();
|
|
|
+ Set<String> allCameraCodes = devices.stream().map(BaseDeviceDynamicManagement::getCameraCode).collect(Collectors.toSet());
|
|
|
+ // 找出未记录日志的设备
|
|
|
+ Set<String> inactiveCameraCodes = new HashSet<>(allCameraCodes);
|
|
|
+ inactiveCameraCodes.removeAll(loggedCameraCodes);
|
|
|
+
|
|
|
+ // 更新设备状态
|
|
|
+ updateDeviceStatus(loggedCameraCodes, 1); // 启用设备
|
|
|
+ updateDeviceStatus(inactiveCameraCodes, 2); // 禁用设备
|
|
|
+
|
|
|
+ // 保存设备状态变更记录
|
|
|
+ saveDeviceResume(loggedCameraCodes, 1);
|
|
|
+ saveDeviceResume(inactiveCameraCodes, 2);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 辅助方法:更新设备状态
|
|
|
+ private void updateDeviceStatus(Set<String> cameraCodes, int status) {
|
|
|
+ if (!cameraCodes.isEmpty()) {
|
|
|
+ LambdaUpdateWrapper<BaseDeviceDynamicManagement> updateWrapper = new LambdaUpdateWrapper<>();
|
|
|
+ updateWrapper.in(BaseDeviceDynamicManagement::getCameraCode, cameraCodes);
|
|
|
+ updateWrapper.set(BaseDeviceDynamicManagement::getIsDisable, status);
|
|
|
+ baseDeviceDynamicManagementService.update(updateWrapper);
|
|
|
}
|
|
|
- if (ObjectUtils.isEmpty(heartIntervalTime)||ObjectUtils.isEmpty(triggerWarningFrequency)){
|
|
|
- time=time*5*3;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 辅助方法:批量保存设备状态变更记录
|
|
|
+ private void saveDeviceResume(Set<String> cameraCodes, int status) {
|
|
|
+ if (cameraCodes.isEmpty()) {
|
|
|
+ return; // 如果集合为空,直接返回
|
|
|
}
|
|
|
- //当前时间5分钟之前的时间戳
|
|
|
- long time2 = dades - (time);
|
|
|
- LambdaQueryWrapper<MqLog> mqLog = new LambdaQueryWrapper<>();
|
|
|
- mqLog.ge(MqLog::getCreateTime, new Date(time2));
|
|
|
- mqLog.le(MqLog::getCreateTime, new Date(dades));
|
|
|
- List<MqLog> list = mqLogService.list(mqLog);
|
|
|
- List<String> log = list.stream().map(MqLog::getCameraCode).collect(Collectors.toList());
|
|
|
- List<BaseDeviceDynamicManagement> dynamicManagements = baseDeviceDynamicManagementService.list();
|
|
|
- List<String> base = dynamicManagements.stream().map(BaseDeviceDynamicManagement::getCameraCode).collect(Collectors.toList());
|
|
|
- if (!ObjectUtils.isEmpty(log)) {
|
|
|
- //找出相机表中不包含日志表相机的数据
|
|
|
- List<BaseDeviceDynamicManagement> ones = dynamicManagements.stream().filter(o -> !log.contains(o.getCameraCode())).collect(Collectors.toList());
|
|
|
- List<String> collect = ones.stream().map(BaseDeviceDynamicManagement::getCameraCode).collect(Collectors.toList());
|
|
|
- //找出相机表中包含日志表相机的数据
|
|
|
- base.retainAll(log);
|
|
|
- LambdaUpdateWrapper<BaseDeviceDynamicManagement> queryWrapper = new LambdaUpdateWrapper<>();
|
|
|
- queryWrapper.in(BaseDeviceDynamicManagement::getCameraCode, base);
|
|
|
- queryWrapper.set(BaseDeviceDynamicManagement::getIsDisable, 1);
|
|
|
- baseDeviceDynamicManagementService.saveOrUpdate(null, queryWrapper);
|
|
|
-
|
|
|
- LambdaUpdateWrapper<BaseDeviceDynamicManagement> wrapper = new LambdaUpdateWrapper<>();
|
|
|
- wrapper.in(BaseDeviceDynamicManagement::getCameraCode, collect);
|
|
|
- wrapper.set(BaseDeviceDynamicManagement::getIsDisable, 2);
|
|
|
- baseDeviceDynamicManagementService.saveOrUpdate(null, wrapper);
|
|
|
- }else {
|
|
|
- LambdaUpdateWrapper<BaseDeviceDynamicManagement> wrapper = new LambdaUpdateWrapper<>();
|
|
|
- wrapper.in(BaseDeviceDynamicManagement::getCameraCode, base);
|
|
|
- wrapper.set(BaseDeviceDynamicManagement::getIsDisable, 2);
|
|
|
- baseDeviceDynamicManagementService.saveOrUpdate(null, wrapper);
|
|
|
+
|
|
|
+ List<BaseDeviceResume> resumes = new ArrayList<>();
|
|
|
+ for (String cameraCode : cameraCodes) {
|
|
|
+ BaseDeviceResume resume = new BaseDeviceResume();
|
|
|
+ resume.setCameraCode(cameraCode);
|
|
|
+ resume.setIsDisable(status);
|
|
|
+ resumes.add(resume);
|
|
|
}
|
|
|
+
|
|
|
+ // 批量保存
|
|
|
+ baseDeviceResumeService.saveBatch(resumes);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -1416,7 +1424,7 @@ ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4
|
|
|
return LocalDate.parse(fullDateStr, DateTimeFormatter.ofPattern("MM dd yyyy"));
|
|
|
}
|
|
|
|
|
|
- public void getDuration(String file) {
|
|
|
+ public void getDuration(String file) {
|
|
|
// String filePath = "/opt/1.m4a";
|
|
|
// try (FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(filePath)) {
|
|
|
// grabber.start();
|