diff --git a/src/main/java/com/zhgd/xmgl/modules/project/entity/bo/ProjectVideoConfigBo.java b/src/main/java/com/zhgd/xmgl/modules/project/entity/bo/ProjectVideoConfigBo.java new file mode 100644 index 000000000..c2fd6a57b --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/modules/project/entity/bo/ProjectVideoConfigBo.java @@ -0,0 +1,9 @@ +package com.zhgd.xmgl.modules.project.entity.bo; + +import com.zhgd.xmgl.modules.project.entity.ProjectVideoConfig; +import lombok.Data; + +@Data +public class ProjectVideoConfigBo extends ProjectVideoConfig { + private String ids; +} diff --git a/src/main/java/com/zhgd/xmgl/modules/project/mapper/ProjectVideoConfigMapper.java b/src/main/java/com/zhgd/xmgl/modules/project/mapper/ProjectVideoConfigMapper.java index 8a3ab4151..46661133a 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/mapper/ProjectVideoConfigMapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/project/mapper/ProjectVideoConfigMapper.java @@ -1,9 +1,12 @@ package com.zhgd.xmgl.modules.project.mapper; +import com.zhgd.xmgl.modules.project.entity.bo.ProjectVideoConfigBo; import org.apache.ibatis.annotations.Mapper; import com.zhgd.xmgl.modules.project.entity.ProjectVideoConfig; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import java.util.List; + /** * @Description: 视频配置 * @author: pds @@ -12,5 +15,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ @Mapper public interface ProjectVideoConfigMapper extends BaseMapper { - + /** + * 查询所有的开启的ISC的配置 + * @return + */ + List getIscConfigsGroupByConfig(); } diff --git a/src/main/java/com/zhgd/xmgl/modules/project/mapper/xml/ProjectVideoConfigMapper.xml b/src/main/java/com/zhgd/xmgl/modules/project/mapper/xml/ProjectVideoConfigMapper.xml index 3509fdb76..668413b19 100644 --- a/src/main/java/com/zhgd/xmgl/modules/project/mapper/xml/ProjectVideoConfigMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/project/mapper/xml/ProjectVideoConfigMapper.xml @@ -1,5 +1,19 @@ - - \ No newline at end of file + + diff --git a/src/main/java/com/zhgd/xmgl/task/VideoTask.java b/src/main/java/com/zhgd/xmgl/task/VideoTask.java index 6680fa35d..ec7938d9a 100644 --- a/src/main/java/com/zhgd/xmgl/task/VideoTask.java +++ b/src/main/java/com/zhgd/xmgl/task/VideoTask.java @@ -1,13 +1,22 @@ package com.zhgd.xmgl.task; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +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.project.entity.ProjectVideoConfig; +import com.zhgd.xmgl.modules.project.entity.bo.ProjectVideoConfigBo; import com.zhgd.xmgl.modules.project.enums.ProjectVideoConfigVideoTypeEnum; import com.zhgd.xmgl.modules.project.mapper.ProjectVideoConfigMapper; import com.zhgd.xmgl.modules.video.entity.VideoItem; import com.zhgd.xmgl.modules.video.mapper.VideoItemMapper; +import com.zhgd.xmgl.modules.video.service.impl.VideoItemServiceImpl; import com.zhgd.xmgl.util.HikVideoUtil; import com.zhgd.xmgl.util.YsVideoUtil; import lombok.extern.slf4j.Slf4j; @@ -15,11 +24,13 @@ import net.javacrumbs.shedlock.core.SchedulerLock; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import java.util.*; +import java.util.stream.Collectors; /** * @program: wisdomSite @@ -41,6 +52,9 @@ public class VideoTask { private String videoAnalysisUrl; @Value("${serverUrl}") private String serverUrl; + @Lazy + @Autowired + private VideoItemServiceImpl videoItemService; @SchedulerLock(name = "updateVideoState", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 5) @Scheduled(cron = "0 */3 * * * ?") @@ -56,7 +70,7 @@ public class VideoTask { } } } catch (Exception e) { - log.error("error:",e); + log.error("error:", e); } } @@ -73,7 +87,7 @@ public class VideoTask { videoItem.setDeviceState(state); videoItemMapper.updateById(videoItem); } - }else if (Objects.equals(videoConfig.getVideoType(), ProjectVideoConfigVideoTypeEnum.ISC.getValue())) { + } else if (Objects.equals(videoConfig.getVideoType(), ProjectVideoConfigVideoTypeEnum.ISC.getValue())) { if (StringUtils.isNotEmpty(videoConfig.getAccount()) && StringUtils.isNotEmpty(videoConfig.getPassword()) && StringUtils.isNotEmpty(videoConfig.getAppId()) && StringUtils.isNotEmpty(videoConfig.getAppSecret())) { for (VideoItem videoItem : list) { @@ -106,6 +120,83 @@ public class VideoTask { } } + /** + * 高频更新isc监控状态 + */ + @Scheduled(cron = "*/10 * * * * ?") + @RequestMapping("updateIscVideoState") + public void updateIscVideoState() { + try { + List projectVideoConfigs = projectVideoConfigMapper.getIscConfigsGroupByConfig(); + Map> videoIdMap = videoItemService.list(new LambdaQueryWrapper() + .select(VideoItem::getItemId, VideoItem::getVideoId, VideoItem::getDeviceState, VideoItem::getSerialNumber)) + .stream() + .collect(Collectors.groupingBy(VideoItem::getVideoId)); + for (ProjectVideoConfigBo videoConfig : projectVideoConfigs) { + // 收集需要更新的视频设备 + List videoItemsToUpdate = new ArrayList<>(); + JSONObject resultJo; + JSONArray alls = new JSONArray(); + int pageNo = 0; + if (StrUtil.isBlank(videoConfig.getIds())) { + continue; + } + List itemDbs = StrUtil.split(videoConfig.getIds(), ",").stream().flatMap(vid -> { + List videoItems = videoIdMap.get(Convert.toLong(vid)); + if (CollUtil.isNotEmpty(videoItems)) { + return videoItems.stream(); + } + return null; + }).filter(Objects::nonNull).collect(Collectors.toList()); + 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")); + + 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()); + Integer newOnlineStatus = jsonObject != null && Objects.equals(jsonObject.getInteger("online"), 1) ? 1 : 2; + // 只有当设备状态发生变化时才更新 + if (!newOnlineStatus.equals(videoItem.getDeviceState())) { + videoItem.setDeviceState(newOnlineStatus); + videoItemsToUpdate.add(videoItem); + } + } + // 批量更新 + if (CollUtil.isNotEmpty(videoItemsToUpdate)) { + List onlineIds = videoItemsToUpdate.stream().filter(v -> Objects.equals(v.getDeviceState(), 1)).map(VideoItem::getItemId).collect(Collectors.toList()); + if (CollUtil.isNotEmpty(onlineIds)) { + videoItemService.update(null, new LambdaUpdateWrapper() + .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()); + if (CollUtil.isNotEmpty(offlineIds)) { + videoItemService.update(null, new LambdaUpdateWrapper() + .set(VideoItem::getDeviceState, 2) + .in(VideoItem::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); diff --git a/src/main/java/com/zhgd/xmgl/util/HikVideoUtil.java b/src/main/java/com/zhgd/xmgl/util/HikVideoUtil.java index ac93216c1..de6933550 100644 --- a/src/main/java/com/zhgd/xmgl/util/HikVideoUtil.java +++ b/src/main/java/com/zhgd/xmgl/util/HikVideoUtil.java @@ -149,6 +149,26 @@ public class HikVideoUtil { return null; } + /** + * 根据条件获取监控点在线状态接口 + */ + public static JSONObject callPostApiOnlineStatus(String Ip, String port, String appke, String appSecret, int pageNo) { + final String getCamsApi = ARTEMIS_PATH + "/api/nms/v1/online/camera/get"; + Map paramMap = new HashMap();// post请求Form表单参数 + paramMap.put("pageNo", pageNo); + paramMap.put("pageSize", 1000); + String body = JSON.toJSON(paramMap).toString(); + Map path = new HashMap(2) { + { + put("https://", getCamsApi); + } + }; + String host = Ip + ":" + port; + String result = doPostStringArtemis(host, path, body, null, null, "application/json", appke, appSecret); + log.debug("callPostApiOnlineStatus:{}", result); + return JSONObject.parseObject(result); + } + public static String setSubscriptionByEvent(String backUrl, String Ip, String port, String appke, String appSecret, Integer[] eventTypes) { String message = null; final String getCamsApi = ARTEMIS_PATH + "/api/eventService/v1/eventSubscriptionByEventTypes"; @@ -279,7 +299,7 @@ public class HikVideoUtil { } public static String doPostStringArtemis(String host, Map path, String body, Map querys, String accept, String contentType, String appKey, String appSecret) { - log.info("海康isc调用http开始>>>>>>>>> host:{},path:{},body:{}", host, JSON.toJSONString(path), body); + log.debug("海康isc调用http开始>>>>>>>>> host:{},path:{},body:{}", host, JSON.toJSONString(path), body); String httpSchema = (String) path.keySet().toArray()[0]; if (httpSchema != null && !StringUtils.isEmpty(httpSchema)) { String responseStr = null; @@ -307,7 +327,7 @@ public class HikVideoUtil { } catch (Exception var10) { log.error("海康isc调用http错误>>>>>>>" + var10); } - log.info("海康isc调用http结果>>>>> {}", responseStr); + log.debug("海康isc调用http结果>>>>> {}", responseStr); return responseStr; } else { throw new RuntimeException("http和https参数错误httpSchema: " + httpSchema);