package com.zhgd.xmgl.task; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zhgd.jeecg.common.mybatis.EntityMap; import com.zhgd.xmgl.async.AsyncHikvision; import com.zhgd.xmgl.call.HikvisionVideoCall; import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.mapper.ProjectMapper; import com.zhgd.xmgl.modules.project.mapper.ProjectVideoConfigMapper; import com.zhgd.xmgl.modules.project.service.ProgressTaskService; import com.zhgd.xmgl.modules.video.entity.ProjectVideoHkVqd; import com.zhgd.xmgl.modules.video.mapper.ProjectVideoHkVqdMapper; import com.zhgd.xmgl.modules.video.mapper.VideoItemMapper; import com.zhgd.xmgl.modules.video.service.impl.VideoItemServiceImpl; import com.zhgd.xmgl.modules.xz.entity.XzHikvisionVideoFull; import com.zhgd.xmgl.modules.xz.entity.XzHikvisionVideoOnline; import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionVideoFullMapper; import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionVideoOnlineMapper; import com.zhgd.xmgl.util.DateUtils; import com.zhgd.xmgl.util.HikvisionUtil; import com.zhgd.xmgl.util.MapBuilder; import lombok.extern.slf4j.Slf4j; import net.javacrumbs.shedlock.core.SchedulerLock; import org.apache.commons.collections4.MapUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.*; import java.util.stream.Collectors; /** * 视频设备(监控点)定时任务 */ @Slf4j @Component public class VideoItemTask { @Lazy @Autowired HikvisionVideoCall hikvisionVideoCall; @Lazy @Autowired AsyncHikvision asyncHikvision; @Lazy @Autowired ProgressTaskService progressTaskService; @Lazy @Autowired VideoItemMapper videoItemMapper; @Lazy @Autowired ProjectVideoConfigMapper projectVideoConfigMapper; @Lazy @Autowired XzHikvisionVideoOnlineMapper xzHikvisionVideoOnlineMapper; @Lazy @Autowired ProjectMapper projectMapper; @Lazy @Autowired ProjectVideoHkVqdMapper projectVideoHkVqdMapper; @Lazy @Autowired XzHikvisionVideoFullMapper xzHikvisionVideoFullMapper; @Lazy @Autowired VideoItemServiceImpl videoItemService; /** * 定时获取录像完整性结果 */ @SchedulerLock(name = "saveXzHikvisionVideoFull", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60 * 5) @Scheduled(cron = "0 0 0/1 * * ?") public void saveXzHikvisionVideoFull() throws Exception { log.info("定时获取录像完整性结果任务开始"); doSaveXzHikvisionVideoFull(new HashMap(16)); } /** * 定时获取录像完整性结果 */ public void doSaveXzHikvisionVideoFull(Map param) throws Exception { param.putIfAbsent("beginTime", new Date()); param.putIfAbsent("endTime", new Date()); List projects = projectMapper.selectList(new LambdaQueryWrapper().eq(Project::getSyncHikvision, 1)); for (Project project : projects) { List videoItems = videoItemMapper.selectProjectVideoList(new MapBuilder().put("projectSn", project.getProjectSn()).build()); if (CollUtil.isEmpty(videoItems)) { return; } JSONObject jo = new JSONObject(); jo.put("pageNo", 1); jo.put("pageSize", 1000); jo.put("beginTime", DateUtils.getISO8601StrWithMs(DateUtil.beginOfDay(DateUtil.parse(MapUtils.getString(param, "beginTime"))))); jo.put("endTime", DateUtils.getISO8601StrWithMs(DateUtil.endOfDay(DateUtil.parse(MapUtils.getString(param, "endTime"))))); jo.put("indexCodes", videoItems.stream().map(entityMap -> entityMap.get("serialNumber")).filter(Objects::nonNull).collect(Collectors.toList())); JSONObject rsJo = hikvisionVideoCall.getNmsRecordForHikvisionForHttp(project, jo); if (HikvisionUtil.isSuccess(rsJo)) { JSONObject dataJo = HikvisionUtil.getJsonObjectData(rsJo); JSONArray listJa = dataJo.getJSONArray("list"); for (int i = 0; i < listJa.size(); i++) { JSONObject oneJo = listJa.getJSONObject(i); String indexCode = oneJo.getString("indexCode"); Integer result = oneJo.getInteger("result"); String date = oneJo.getString("date"); JSONArray videoClipstimeSegmentJa = oneJo.getJSONArray("videoClipstimeSegment"); for (int j = 0; j < videoClipstimeSegmentJa.size(); j++) { XzHikvisionVideoFull entity = new XzHikvisionVideoFull(); entity.setProjectSn(project.getProjectSn()); entity.setSerialNumber(indexCode); entity.setType(result); entity.setDate(date); JSONObject jo1 = videoClipstimeSegmentJa.getJSONObject(j); Integer from = jo1.getInteger("from"); entity.setFrom(from); Integer to = jo1.getInteger("to"); entity.setTo(to); Integer count = xzHikvisionVideoFullMapper.selectCount(new LambdaQueryWrapper() .eq(XzHikvisionVideoFull::getSerialNumber, entity.getSerialNumber()) .eq(XzHikvisionVideoFull::getDate, entity.getDate()) .eq(XzHikvisionVideoFull::getFrom, entity.getFrom()) ); if (count != 0) { return; } xzHikvisionVideoFullMapper.insert(entity); } } } } } /** * 定时获取视频质量诊断结果 */ @SchedulerLock(name = "addVqdForHikvision", lockAtMostFor = 1000 * 60 * 60, lockAtLeastFor = 1000 * 60) @Scheduled(cron = "0 0 0/1 * * ?") public void addVqdForHikvision() throws Exception { log.info("定时获取视频质量诊断结果任务开始"); List projects = projectMapper.selectList(new LambdaQueryWrapper().eq(Project::getSyncHikvision, 1)); for (Project project : projects) { List videoItems = videoItemMapper.selectProjectVideoList(new MapBuilder().put("projectSn", project.getProjectSn()).build()); if (CollUtil.isEmpty(videoItems)) { return; } JSONObject jo = new JSONObject(); jo.put("pageNo", 1); jo.put("pageSize", 1000); jo.put("indexCodes", videoItems.stream().map(entityMap -> entityMap.get("serialNumber")).filter(Objects::nonNull).collect(Collectors.toList())); JSONObject rsJo = hikvisionVideoCall.getVqdForHikvisionForHttp(project, jo); if (HikvisionUtil.isSuccess(rsJo)) { JSONObject dataJo = HikvisionUtil.getJsonObjectData(rsJo); JSONArray listJa = dataJo.getJSONArray("list"); for (int i = 0; i < listJa.size(); i++) { JSONObject oneJo = listJa.getJSONObject(i); ProjectVideoHkVqd entity = new ProjectVideoHkVqd(); BeanUtil.copyProperties(oneJo, entity); entity.setProjectSn(project.getProjectSn()); entity.setSerialNumber(oneJo.getString("indexCode")); projectVideoHkVqdMapper.insert(entity); } } } } /** * 3分钟保存一次监控在线状态 */ @SchedulerLock(name = "saveDeviceState", lockAtMostFor = 1000 * 60, lockAtLeastFor = 1000 * 60) @Scheduled(cron = "0 */3 * * * ?") public void saveDeviceState() throws Exception { log.info("3分钟保存一次监控在线状态"); List projects = projectMapper.selectList(new LambdaQueryWrapper().eq(Project::getSyncHikvision, 1)); for (Project project : projects) { List videoItems = videoItemMapper.selectProjectVideoList(new MapBuilder().put("projectSn", project.getProjectSn()).build()); if (CollUtil.isEmpty(videoItems)) { return; } JSONObject jo = new JSONObject(); jo.put("pageNo", 1); jo.put("pageSize", 1000); jo.put("indexCodes", videoItems.stream().map(entityMap -> entityMap.get("serialNumber")).filter(Objects::nonNull).collect(Collectors.toList())); JSONObject rsJo = hikvisionVideoCall.getCameraOnlineForHttp(project, jo); if (HikvisionUtil.isSuccess(rsJo)) { JSONObject dataJo = HikvisionUtil.getJsonObjectData(rsJo); JSONArray listJa = dataJo.getJSONArray("list"); for (int i = 0; i < listJa.size(); i++) { JSONObject oneJo = listJa.getJSONObject(i); XzHikvisionVideoOnline entity = new XzHikvisionVideoOnline(); entity.setProjectSn(project.getProjectSn()); entity.setSerialNumber(oneJo.getString("indexCode")); entity.setDeviceState(Optional.ofNullable(oneJo.getInteger("online")).map(integer -> integer == 0 ? 1 : 2).orElse(3)); xzHikvisionVideoOnlineMapper.insert(entity); } } } } }