package com.ld.igds.timer; import com.bstek.dorado.annotation.Expose; import com.ld.igds.camera.ApiCameraManager; import com.ld.igds.camera.CameraUtil; import com.ld.igds.camera.data.ApiCameraResp; import com.ld.igds.camera.data.ApiSnapReq; import com.ld.igds.data.ConfigData; import com.ld.igds.file.CoreFileService; import com.ld.igds.models.SecCamera; import com.ld.igds.models.SecSnapConf; import com.ld.igds.models.SnapSer; import com.ld.igds.sec.service.CoreSecCameraService; import com.ld.igds.sec.service.SecSnapDepotService; import com.ld.igds.util.ContextUtil; import com.ld.igds.util.DateUtil; import com.ld.igds.view.service.SnapSerService; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 安防模块标定时器配置 */ @Slf4j @Component(ScheduledSec.BEAN_ID) public class ScheduledSec { public static final String BEAN_ID = "sec.scheduled"; @Resource private ConfigData configData; @Resource private SecSnapDepotService secSnapService; @Resource private CoreSecCameraService coreSecCameraService; @Resource private SnapSerService snapSerService; @Resource private CoreFileService fileService; @Resource private ApiCameraManager apiCameraManager; /** * 从6-18点开始执行 */ @Scheduled(cron = "0 0 6,7,8,9,10,11,12,13,14,15,16,17,18 * * ? ") public void scheduled30() { Date exeDate = new Date(); // 执行抓拍判断 doExeSnap(exeDate,false); } /** * sec.scheduled#exeByHand * 手动执行 */ @Expose public void exeByHand(){ Date exeDate = new Date(); // 执行抓拍判断 doExeSnap(exeDate,true); } /** * 定时执行抓拍 */ private void doExeSnap(Date date,boolean isByHand) { try { // 获取所有配置抓拍摄像头 List list = secSnapService.listSnapConf( configData.getDefaultCompanyId(), null); if (null == list || list.isEmpty()) { return; } SecSnapConf exeConf = list.get(0); // 获取抓拍时间 int exeHour1 = exeConf.getActHour1(); int exeHour2 = exeConf.getActHour2(); int exeHour3 = exeConf.getActHour3(); if (exeHour1 == 0 && exeHour1 == 0 && exeHour1 == 0) return; // 获取当前系统时间 int curHour = DateUtil.getHour(date); if(isByHand){ exeHour1 = curHour; } if(curHour != exeHour1 && curHour != exeHour2 && curHour !=exeHour3){ return; } log.info("===================执行定时仓内视频抓拍=================="); SecCamera secCamera; Map snapSerMap = new HashMap<>(); SnapSer snapSer; for (SecSnapConf snapConf : list) { secCamera = coreSecCameraService.getCameraById( snapConf.getCompanyId(), snapConf.getCameraId()); if (null == secCamera) continue; snapSer = snapSerMap.get(snapConf.getDeptId()); if (null == snapSer) { snapSer = snapSerService.getCacheByDeptId(snapConf.getDeptId()); snapSerMap.put(snapConf.getDeptId(), snapSer); } if (null == snapSer) { log.error("------------抓拍为配置抓拍分机----------"); continue; } doExeSnapToData(secCamera, snapSer, snapConf); Thread.sleep(500); } } catch (Exception e) { log.error("----------抓拍后台出错---------{}", e); } } private void doExeSnapToData(SecCamera secCamera, SnapSer snapSer,SecSnapConf snapConf) { ApiSnapReq req = new ApiSnapReq(); req.setCompanyId(secCamera.getCompanyId()); req.setDeptId(secCamera.getDeptId()); req.setSn(secCamera.getSn()); req.setSnapType(secCamera.getSnapType()); req.setPlayType(secCamera.getPlayType()); req.setSerSn(snapSer.getSn()); req.setCameraName(secCamera.getName()); req.setBizId(null); req.setMediaAddr(CameraUtil.updateMediaAddr(secCamera.getMediaAddr(), secCamera.getLoginId(), secCamera.getPwd(), secCamera.getIpIn(), secCamera.getPortInC(), secCamera.getChanNum())); String filePath = fileService.getSnapFilePath(new Date()); req.setFilePath(filePath); // 调整附件名称,避免出现中文 String fileName = snapConf.getDepotId() + "_" + ContextUtil.getTimeId(1000) + ".jpg"; req.setFileName(fileName); // 执行抓拍 ApiCameraResp resp = apiCameraManager.getApiCameraService(secCamera.getPlayType()).snapImg(req); resp.setFileName(fileName); // 执行记录保存 secSnapService.addData(snapConf, fileName, resp.getCode()); } }