package com.zhgd.xmgl.task; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.IdUtil; 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.entity.ProjectVideoConfig; import com.zhgd.xmgl.modules.project.mapper.ProjectMapper; import com.zhgd.xmgl.modules.project.mapper.ProjectVideoConfigMapper; import com.zhgd.xmgl.modules.project.service.IProjectService; import com.zhgd.xmgl.modules.project.service.IProjectVideoConfigService; import com.zhgd.xmgl.modules.project.service.ProgressTaskService; import com.zhgd.xmgl.modules.video.entity.ProjectVideoHkVqd; import com.zhgd.xmgl.modules.video.entity.VideoItem; 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.*; 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.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.io.File; import java.util.*; import java.util.stream.Collectors; /** * 视频设备(监控点)定时任务 */ @Slf4j @RestController @RequestMapping("/xmgl/task/") 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; @Lazy @Autowired private IProjectService projectService; @Lazy @Autowired private IProjectVideoConfigService projectVideoConfigService; /** * 定时获取录像完整性结果 */ @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); } } } } // // /** // * 每2个小时更新一下监控封面 // * // * @throws Exception // */ // @RequestMapping("saveVideoItemCover") // @SchedulerLock(name = "saveVideoItemCover", lockAtMostFor = 1000 * 60, lockAtLeastFor = 1000 * 60) // @Scheduled(cron = "0 0 */2 * * ?") // public void saveVideoItemCover() throws Exception { // List configList = projectVideoConfigService.list(new LambdaQueryWrapper() // .eq(ProjectVideoConfig::getIsEnable, 1)); // List itemList = videoItemService.list(); // String basePath = "videoItemCover"; // for (ProjectVideoConfig projectVideoConfig : configList) { // if (Objects.equals(projectVideoConfig.getVideoType(), 3)) { // List items = itemList.stream().filter(o -> Objects.equals(o.getVideoId(), projectVideoConfig.getId())).collect(Collectors.toList()); // for (VideoItem item : items) { // saveVideoItemCoverAsync(basePath, projectVideoConfig, item); // } // } // } // } // // @Async("saveVideoItemCover") // public void saveVideoItemCoverAsync(String basePath, ProjectVideoConfig projectVideoConfig, VideoItem item) throws Exception { // try { // String url = HikVideoUtil.callPostApiGetPreviewURL(item.getSerialNumber(), "rtsp", // 2, projectVideoConfig.getAccount(), // projectVideoConfig.getPassword(), projectVideoConfig.getAppId(), projectVideoConfig.getAppSecret()); // if (url != null) { // String uuidPic = IdUtil.fastUUID() + ".jpg"; // String picPath = PathUtil.getBasePath() + "/" + basePath + "/" + uuidPic; // new File(picPath).getParentFile().mkdirs(); // RtspUtils.getVideoImagePathByRSTP(url, picPath); // item.setCoverUrl(PathUtil.getServerUrl() + "/image/" + basePath + "/" + uuidPic); // videoItemService.updateById(item); // } // } catch (Exception e) { // e.printStackTrace(); // } // } }