package com.tievd.jyz.handler.alg.common; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.tievd.jyz.cache.DepartCache; import com.tievd.jyz.cache.DeviceCache; import com.tievd.jyz.entity.*; import com.tievd.jyz.handler.alg.AlgHandleInterface; import com.tievd.jyz.mqtt.dto.EventInfoDTO; import com.tievd.jyz.service.ICameraService; import com.tievd.jyz.service.IPatrolConfigService; import com.tievd.jyz.service.IPatrolEventService; import com.tievd.jyz.service.IPatrolRecordService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.sql.Timestamp; import java.time.LocalDate; import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; /** * 通用异常算法处理类 * @author timi */ @Slf4j @Component public class PatrolEventAlgHandler implements AlgHandleInterface { /** 通用算法标识头 */ private final String[] ALG_TAG = new String[]{ "P10001", "P10002", "P10003", "P10004", "P10005" }; private final byte defaultEventType = 2; @Autowired private ICameraService cameraService; @Autowired private IPatrolEventService patrolEventService; @Autowired private IPatrolRecordService patrolRecordService; @Autowired private IPatrolConfigService patrolConfigService; @Override public String[] getAlgTag(){ return ALG_TAG; } /** * 处理入口 * @param eventInfoDTO * @param sn * @param time */ @Override public void handle(EventInfoDTO eventInfoDTO, String sn,String time) { //当前事件唯一标识 String eventCode = eventInfoDTO.getEventCode();; //检测算法编码 String algCode = eventInfoDTO.getAlgCode(); //终端编码 String cameraCode = eventInfoDTO.getCameraCode(); //扩展属性 JSONObject extend = null; try { extend = JSONObject.parseObject(String.valueOf(eventInfoDTO.getExtend())); } catch (Exception e) { log.info("extend 转换失败:{}", eventInfoDTO.getExtend()); extend = new JSONObject(); } log.info("通用异常事件 eventCode:{},extend:{}",eventCode, extend); Device device = DeviceCache.getDeviceBySn(sn); if(ObjectUtil.isNull(device)){ log.error("网关设备不存在,sn:{}",sn); return; } alarmHandle(eventCode,algCode,cameraCode,time,extend,device); } /** * 异常告警处理 * @param eventCode * @param algCode * @param cameraCode * @param time * @param extend * @param device */ private void alarmHandle(String eventCode,String algCode, String cameraCode,String time,JSONObject extend,Device device){ String orgCode = device.getOrgCode(); String orgName = DepartCache.getDepartByOrgCode(orgCode).getDepartName(); Timestamp eventTime = new Timestamp(Long.valueOf(time)); int personCount = 0; if (extend != null) { personCount = extend.getIntValue("personCount"); } Camera camera = cameraService.getOne(new LambdaQueryWrapper().eq(Camera::getCode, cameraCode), false); if (camera == null) { log.info("====================》 摄像头不存在:", camera); return; } List patrolConfigs = patrolConfigService.list(new QueryWrapper<>(new PatrolConfig().setOrgCode(device.getOrgCode()))); if (patrolConfigs.size() == 0) { log.info("==========> 该机构暂未启用巡查配置:", camera.getOrgName()); return; } String date = LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("org_code", orgCode); wrapper.eq("DATE(create_time)", date); PatrolRecord record = null; synchronized (this) { record = patrolRecordService.getOne(wrapper, false); //每天第一次巡查上报是生成记录和事件 if (record == null) { record = new PatrolRecord().setStartTime(eventTime) .setCreateTime(eventTime) .setOrgCode(orgCode) .setOrgName(orgName); patrolRecordService.save(record); List eventList = new ArrayList<>(); for (PatrolConfig config : patrolConfigs) { PatrolEvent event = BeanUtil.copyProperties(config, PatrolEvent.class, "id"); event.setRecordId(record.getId()) .setCreateTime(eventTime) .setCameraCode(cameraCode) .setCameraName(camera.getName()) .setDeviceId(device.getId()) .setDeviceName(device.getName()) .setOrgCode(orgCode) .setOrgName(orgName) .setEventType(defaultEventType) .setEventAddress(camera.getInstallAddress()); eventList.add(event); } patrolEventService.saveBatch(eventList); } } wrapper.eq("algorithm_code", algCode); wrapper.eq("camera_code", cameraCode); PatrolEvent eventNow = patrolEventService.getOne(wrapper, false); if (eventNow == null) { log.info("==========> 未配置的巡查项:", algCode); return; } //防止重复更新时间和图片 if (StringUtils.isBlank(eventNow.getImgPath())) { eventNow.setEventType((byte) 1) .setEventTimefAbsent(eventTime) .setImgUid(eventCode) .setPersonCount((byte)personCount); patrolEventService.updateById(eventNow); } if (record.getEndTime() == null) { long count = patrolEventService.count( new LambdaQueryWrapper() .eq(PatrolEvent::getRecordId, eventNow.getRecordId()) .eq(PatrolEvent::getEventType, defaultEventType) ); if (count == 0) { endRecord(eventNow.getRecordId()); } } } public void endRecord(long recordId) { PatrolRecord record = patrolRecordService.getById(recordId); record.setEndTime(new Timestamp(System.currentTimeMillis())); long spand = record.getEndTime().getTime() - record.getStartTime().getTime(); spand = spand / (1000 * 60); record.setSpandTime((int)spand); patrolRecordService.updateById(record); } @Scheduled(cron = "${jyz.timer.patrol-record:0 * * * * ?}") public void recordEndCheck() { List records = patrolRecordService.list(new LambdaQueryWrapper().isNull(PatrolRecord::getEndTime)); for (PatrolRecord record : records) { //第二天直接结束巡查记录 LocalDate start = record.getStartTime().toLocalDateTime().toLocalDate(); if (LocalDate.now().isAfter(start)) { endRecord(record.getId()); continue; } String orgCode = record.getOrgCode(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("org_code", orgCode); wrapper.select("MAX(time_end) timeEnd"); PatrolConfig config = patrolConfigService.getOne(wrapper, false); //超过时间段,结束巡查记录 if (LocalTime.now().isAfter(config.getTimeEnd().toLocalTime())) { endRecord(record.getId()); } } } }