From 856a176426adf5294947b2b3d6a89073d7c8ba0c Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Wed, 5 Nov 2025 17:32:55 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=A7=E6=B3=95=E8=AE=B0=E5=BD=95=E4=BB=AA?= =?UTF-8?q?=E7=9A=84=E7=8A=B6=E6=80=81=E6=94=B9=E6=88=90=E5=8F=96isc?= =?UTF-8?q?=E7=9A=84=E7=9B=91=E6=8E=A7=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../policecamera/entity/PoliceCameraItem.java | 4 +- .../entity/bo/PoliceCameraVideoConfigBo.java | 14 ++ .../mapper/PoliceCameraVideoConfigMapper.java | 13 +- .../java/com/zhgd/xmgl/task/Mcs8Task.java | 36 +++--- .../java/com/zhgd/xmgl/task/VideoTask.java | 122 +++++++++++++++--- 5 files changed, 147 insertions(+), 42 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/modules/policecamera/entity/bo/PoliceCameraVideoConfigBo.java diff --git a/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/PoliceCameraItem.java b/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/PoliceCameraItem.java index 8864a7597..876a50e52 100644 --- a/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/PoliceCameraItem.java +++ b/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/PoliceCameraItem.java @@ -123,9 +123,9 @@ public class PoliceCameraItem implements Serializable { @ApiModelProperty(value = "电量") private java.lang.String batteryLevel; /** - * 设备状态,1在线,2离线 + * 设备状态,1在线,2离线(监控) */ - @ApiModelProperty(value = "设备状态,1在线,2离线") + @ApiModelProperty(value = "设备状态,1在线,2离线(监控)") private java.lang.Integer deviceState; /** * 排序 diff --git a/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/bo/PoliceCameraVideoConfigBo.java b/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/bo/PoliceCameraVideoConfigBo.java new file mode 100644 index 000000000..41d35d654 --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/policecamera/entity/bo/PoliceCameraVideoConfigBo.java @@ -0,0 +1,14 @@ +package com.zhgd.xmgl.modules.policecamera.entity.bo; + +import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraVideoConfig; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class PoliceCameraVideoConfigBo extends PoliceCameraVideoConfig { + /** + *projectSns + */ + @ApiModelProperty("projectSns") + private String projectSns; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/policecamera/mapper/PoliceCameraVideoConfigMapper.java b/src/main/java/com/zhgd/xmgl/modules/policecamera/mapper/PoliceCameraVideoConfigMapper.java index 3ce0b6dca..f3a8fd4d2 100644 --- a/src/main/java/com/zhgd/xmgl/modules/policecamera/mapper/PoliceCameraVideoConfigMapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/policecamera/mapper/PoliceCameraVideoConfigMapper.java @@ -1,18 +1,17 @@ package com.zhgd.xmgl.modules.policecamera.mapper; -import java.util.List; -import java.util.HashMap; - -import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraVideoConfig; -import com.zhgd.xmgl.modules.policecamera.entity.vo.PoliceCameraVideoConfigVo; -import com.zhgd.xmgl.modules.policecamera.entity.dto.PoliceCameraVideoConfigDto; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraVideoConfig; +import com.zhgd.xmgl.modules.policecamera.entity.vo.PoliceCameraVideoConfigVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.HashMap; +import java.util.List; /** * @Description: 执法记录仪视频配置 diff --git a/src/main/java/com/zhgd/xmgl/task/Mcs8Task.java b/src/main/java/com/zhgd/xmgl/task/Mcs8Task.java index a83e9ae9a..004632d3d 100644 --- a/src/main/java/com/zhgd/xmgl/task/Mcs8Task.java +++ b/src/main/java/com/zhgd/xmgl/task/Mcs8Task.java @@ -61,24 +61,24 @@ public class Mcs8Task { } - /** - * 定时更新执法仪设备状态 - */ - @Scheduled(cron = "*/5 * * * * ?") - @RequestMapping("updateStatus") - public void updateStatus() { - List projects = projectService.list(); - for (Project project : projects) { - try { - PoliceCameraManufacturer manufacturer = policeCameraManufacturerFactory.getPoliceCameraManufacturer(project.getProjectSn()); - if (manufacturer != null) { - manufacturer.updateStatus(3L); - } - } catch (Exception e) { - log.error("定时更新执法仪设备状态err,{}", project.getProjectName(), e); - } - } - } +// /** +// * 定时更新执法仪设备状态 +// */ +// @Scheduled(cron = "*/5 * * * * ?") +// @RequestMapping("updateStatus") +// public void updateStatus() { +// List projects = projectService.list(); +// for (Project project : projects) { +// try { +// PoliceCameraManufacturer manufacturer = policeCameraManufacturerFactory.getPoliceCameraManufacturer(project.getProjectSn()); +// if (manufacturer != null) { +// manufacturer.updateStatus(3L); +// } +// } catch (Exception e) { +// log.error("定时更新执法仪设备状态err,{}", project.getProjectName(), e); +// } +// } +// } } diff --git a/src/main/java/com/zhgd/xmgl/task/VideoTask.java b/src/main/java/com/zhgd/xmgl/task/VideoTask.java index ec7938d9a..6c9bed9f0 100644 --- a/src/main/java/com/zhgd/xmgl/task/VideoTask.java +++ b/src/main/java/com/zhgd/xmgl/task/VideoTask.java @@ -10,6 +10,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.zhgd.xmgl.async.AsyncEnvironment; +import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraItem; +import com.zhgd.xmgl.modules.policecamera.entity.PoliceCameraVideoConfig; +import com.zhgd.xmgl.modules.policecamera.service.IPoliceCameraItemService; +import com.zhgd.xmgl.modules.policecamera.service.IPoliceCameraVideoConfigService; import com.zhgd.xmgl.modules.project.entity.ProjectVideoConfig; import com.zhgd.xmgl.modules.project.entity.bo.ProjectVideoConfigBo; import com.zhgd.xmgl.modules.project.enums.ProjectVideoConfigVideoTypeEnum; @@ -55,6 +59,12 @@ public class VideoTask { @Lazy @Autowired private VideoItemServiceImpl videoItemService; + @Lazy + @Autowired + private IPoliceCameraVideoConfigService policeCameraVideoConfigService; + @Lazy + @Autowired + private IPoliceCameraItemService policeCameraItemService; @SchedulerLock(name = "updateVideoState", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 5) @Scheduled(cron = "0 */3 * * * ?") @@ -151,20 +161,23 @@ public class VideoTask { if (CollUtil.isEmpty(itemDbs)) { continue; } - do { - resultJo = HikVideoUtil.callPostApiOnlineStatus(videoConfig.getAccount(), - videoConfig.getPassword(), videoConfig.getAppId(), - videoConfig.getAppSecret(), ++pageNo); - if (resultJo != null && "0".equals(resultJo.getString("code"))) { - alls.addAll(resultJo.getJSONObject("data").getJSONArray("list")); - } else { - log.error("高频更新isc监控状态返回错误:项目sn:{}:code:{},msg:{}", - videoConfig.getProjectSn(), resultJo != null ? resultJo.getString("code") : "", - resultJo != null ? resultJo.getString("msg") : ""); - break; - } - } while (pageNo * 1000 < resultJo.getJSONObject("data").getInteger("total")); - + try { + do { + resultJo = HikVideoUtil.callPostApiOnlineStatus(videoConfig.getAccount(), + videoConfig.getPassword(), videoConfig.getAppId(), + videoConfig.getAppSecret(), ++pageNo); + if (resultJo != null && "0".equals(resultJo.getString("code"))) { + alls.addAll(resultJo.getJSONObject("data").getJSONArray("list")); + } else { + log.error("高频更新isc监控状态返回错误:项目sn:{}:code:{},msg:{}", + videoConfig.getProjectSn(), resultJo != null ? resultJo.getString("code") : "", + resultJo != null ? resultJo.getString("msg") : ""); + break; + } + } while (pageNo * 1000 < resultJo.getJSONObject("data").getInteger("total")); + } catch (Exception e) { + log.error("高频更新isc监控状态返回异常", e); + } Map indexCodeMap = alls.stream().collect(Collectors.toMap(j -> ((JSONObject) j).getString("indexCode"), j -> ((JSONObject) j), (o1, o2) -> o1)); for (VideoItem videoItem : itemDbs) { JSONObject jsonObject = indexCodeMap.get(videoItem.getSerialNumber()); @@ -183,7 +196,8 @@ public class VideoTask { .set(VideoItem::getDeviceState, 1) .in(VideoItem::getItemId, onlineIds) ); - } List offlineIds = videoItemsToUpdate.stream().filter(v -> Objects.equals(v.getDeviceState(), 2)).map(VideoItem::getItemId).collect(Collectors.toList()); + } + List offlineIds = videoItemsToUpdate.stream().filter(v -> Objects.equals(v.getDeviceState(), 2)).map(VideoItem::getItemId).collect(Collectors.toList()); if (CollUtil.isNotEmpty(offlineIds)) { videoItemService.update(null, new LambdaUpdateWrapper() .set(VideoItem::getDeviceState, 2) @@ -197,6 +211,84 @@ public class VideoTask { } } + /** + * 高频更新执法记录仪的isc监控状态 + */ + @Scheduled(cron = "*/10 * * * * ?") + @RequestMapping("updatePoliceCameraItemIscVideoState") + public void updatePoliceCameraItemIscVideoState() { + try { + List configs = policeCameraVideoConfigService.list(new QueryWrapper<>()); + Map> projectSnMap2ItemsMap = policeCameraItemService.list(new LambdaQueryWrapper()).stream().collect(Collectors.groupingBy(PoliceCameraItem::getProjectSn)); + Map> projectSn2IndexCodeMap = new HashMap<>(); + for (PoliceCameraVideoConfig videoConfig : configs) { + // 收集需要更新的视频设备 + List videoItemsToUpdate = new ArrayList<>(); + List itemDbs = projectSnMap2ItemsMap.get(videoConfig.getProjectSn()); + if (CollUtil.isEmpty(itemDbs)) { + continue; + } + Map indexCodeMap = projectSn2IndexCodeMap.computeIfAbsent(StrUtil.format("{},{},{},{}", videoConfig.getIp(), + videoConfig.getPort(), videoConfig.getAppId(), + videoConfig.getAppSecret()), key -> { + if (StrUtil.isBlank(videoConfig.getIp()) || StrUtil.isBlank(videoConfig.getPort()) || StrUtil.isBlank(videoConfig.getAppId()) || StrUtil.isBlank(videoConfig.getAppSecret())) { + return new HashMap<>(); + } + JSONArray alls = new JSONArray(); + try { + JSONObject resultJo; + int pageNo = 0; + do { + resultJo = HikVideoUtil.callPostApiOnlineStatus(videoConfig.getIp(), + videoConfig.getPort(), videoConfig.getAppId(), + videoConfig.getAppSecret(), ++pageNo); + if (resultJo != null && "0".equals(resultJo.getString("code"))) { + alls.addAll(resultJo.getJSONObject("data").getJSONArray("list")); + } else { + log.error("高频更新执法记录仪的isc监控状态返回错误:项目sn:{}:code:{},msg:{}", + videoConfig.getProjectSn(), resultJo != null ? resultJo.getString("code") : "", + resultJo != null ? resultJo.getString("msg") : ""); + break; + } + } while (pageNo * 1000 < resultJo.getJSONObject("data").getInteger("total")); + } catch (Exception e) { + log.error("高频更新执法记录仪的isc监控状态返回异常", e); + } + return alls.stream().collect(Collectors.toMap(j -> ((JSONObject) j).getString("indexCode"), j -> ((JSONObject) j), (o1, o2) -> o1)); + }); + + for (PoliceCameraItem item : itemDbs) { + JSONObject jsonObject = indexCodeMap.get(item.getMonitoringNumber()); + Integer newOnlineStatus = jsonObject != null && Objects.equals(jsonObject.getInteger("online"), 1) ? 1 : 2; + // 只有当设备状态发生变化时才更新 + if (!newOnlineStatus.equals(item.getDeviceState())) { + item.setDeviceState(newOnlineStatus); + videoItemsToUpdate.add(item); + } + } + // 批量更新 + if (CollUtil.isNotEmpty(videoItemsToUpdate)) { + List onlineIds = videoItemsToUpdate.stream().filter(v -> Objects.equals(v.getDeviceState(), 1)).map(PoliceCameraItem::getItemId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(onlineIds)) { + policeCameraItemService.update(null, new LambdaUpdateWrapper() + .set(PoliceCameraItem::getDeviceState, 1) + .in(PoliceCameraItem::getItemId, onlineIds) + ); + } + List offlineIds = videoItemsToUpdate.stream().filter(v -> Objects.equals(v.getDeviceState(), 2)).map(PoliceCameraItem::getItemId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(offlineIds)) { + policeCameraItemService.update(null, new LambdaUpdateWrapper() + .set(PoliceCameraItem::getDeviceState, 2) + .in(PoliceCameraItem::getItemId, offlineIds) + ); + } + } + } + } catch (Exception e) { + log.error("高频更新执法记录仪的isc监控状态返回错误", e); + } + } + private void sendVideoData(VideoItem videoItem, ProjectVideoConfig videoConfig) { List> list = new ArrayList<>(); Map video = new HashMap<>(16);