package com.tievd.jyz.handler.alg.common; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.tievd.cube.modules.system.entity.SysDepart; import com.tievd.jyz.cache.AlgorithmCache; import com.tievd.jyz.cache.DepartCache; import com.tievd.jyz.cache.DeviceCache; import com.tievd.jyz.constants.SystemConstant; import com.tievd.jyz.entity.*; import com.tievd.jyz.handler.alg.AlgHandleInterface; import com.tievd.jyz.mapper.CameraMapper; import com.tievd.jyz.mapper.OilEventMapper; import com.tievd.jyz.mapper.SpotcheckEventMapper; import com.tievd.jyz.mqtt.command.MqttCommandReceiver; import com.tievd.jyz.mqtt.dto.EventInfoDTO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.sql.Timestamp; import java.time.LocalDate; /** * 通用异常算法处理类 * @author timi */ @Slf4j @Component public class CommonAlarmAlgHandler implements AlgHandleInterface { /** 通用算法标识头 */ private final String[] ALG_TAG = new String[]{ "C10002", "C10003", "C10005", "C10006", "C20001", "C20002", "C30001", "C30002", "C30003", "C30004", "C20003", "C20004", "C20005", "C20006", "C20007", "C20008", "C20009", "C20010", "C20011", "S10001", "S10002" }; @Autowired private OilEventMapper oilEventMapper; @Autowired private SpotcheckEventMapper spotcheckEventMapper; @Autowired private CameraMapper cameraMapper; @Autowired private MqttCommandReceiver mqttCommandReceiver; @Value("${init.sendCommandTopic:/ty/aibox/command/}") private String sendCommandTopic; @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 = new JSONObject(); Object extendObj = eventInfoDTO.getExtend(); if(extendObj instanceof String){ extend = JSONObject.parseObject(extendObj.toString()); }else if(extendObj instanceof JSONObject){ extend = (JSONObject)extendObj; } log.info("通用异常事件 eventCode:{},extend:{}",eventCode,extendObj); 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){ JSONArray carArr = extend.getJSONArray("cars"); if(carArr.size() == 0){ JSONObject jsonObject = new JSONObject(); jsonObject.put("number",""); carArr.add(jsonObject); } for(Object obj: carArr){ JSONObject infoObj = (JSONObject) obj; String plateNumber = infoObj.getString("number"); OilEvent oilEvent = oilEventGen(eventCode,algCode,cameraCode,time,device); if(ObjectUtil.isNotNull(oilEvent)){ if (algCode.contains("S")) { SpotcheckEvent spotcheckEvent = BeanUtil.toBean(oilEvent, SpotcheckEvent.class); spotcheckEventMapper.insert(spotcheckEvent); } else { oilEvent.setLicenseNum(plateNumber); oilEventMapper.insert(oilEvent); } } } //默认自动请求 //请求图片和短视频 // log.info("请求图片和短视频,eventCode:{}",eventCode); // EventResourceDTO eventResourceDTO = new EventResourceDTO(SystemConstant.ALL_SOURCE_TYPE,eventCode,cameraCode); // EventResourceCommand eventResourceCommand = new EventResourceCommand(mqttCommandReceiver,eventResourceDTO,sendCommandTopic,device.getSn()); // eventResourceCommand.init(); // if(eventResourceCommand.execute() == SystemConstant.DEAL_FAIL){ // log.error("事件图片视频指令发送失败"); // } } /** * 异常时间对象生成 * @param eventCode * @param algCode * @param cameraCode * @param time * @param device * @return */ private OilEvent oilEventGen(String eventCode,String algCode,String cameraCode,String time,Device device){ Camera camera = cameraMapper.selectOne(new QueryWrapper().eq("code",cameraCode).eq("device_id",device.getId())); if(ObjectUtil.isNull(camera)){ log.error("平台终端不存在,code:{}",cameraCode); return null; } OilEvent oilEvent = new OilEvent(); oilEvent.setAlgorithmCode(algCode); SysAlgorithmItem sysAlgorithmItem = AlgorithmCache.getAlgorithmMap(algCode); if(ObjectUtil.isNotNull(sysAlgorithmItem)){ oilEvent.setAlgorithmName(sysAlgorithmItem.getAlgorithmName()); } oilEvent.setEventAddress(camera.getInstallAddress()); oilEvent.setCameraCode(camera.getCode()); oilEvent.setCameraName(camera.getName()); oilEvent.setDeviceId(device.getId()); oilEvent.setDeviceName(device.getName()); oilEvent.setOrgCode(device.getOrgCode()); oilEvent.setEventDay(LocalDate.now().format(SystemConstant.DATE_DAY_FORMATTER)); SysDepart sysDepart = DepartCache.getDepartByOrgCode(device.getOrgCode()); if(ObjectUtil.isNotNull(sysDepart)){ oilEvent.setOrgName(sysDepart.getDepartName()); } oilEvent.setEventTime(new Timestamp(Long.parseLong(time))); oilEvent.setImgUid(eventCode); oilEvent.setCreateTime(new Timestamp(System.currentTimeMillis())); return oilEvent; } }