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<JSONObject> 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<Camera>().eq(Camera::getCode, cameraCode), false);
|
if (camera == null) {
|
log.info("====================》 摄像头不存在:", camera);
|
return;
|
}
|
List<PatrolConfig> 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<PatrolEvent> 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<PatrolEvent>()
|
.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<PatrolRecord> records = patrolRecordService.list(new LambdaQueryWrapper<PatrolRecord>().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<PatrolConfig> 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());
|
}
|
}
|
}
|
|
}
|