package com.tievd.jyz.handler.alg.oil; 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.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.mqtt.command.MqttCommandReceiver; import com.tievd.jyz.mqtt.dto.EventInfoDTO; import com.tievd.jyz.service.IOiloutEventService; import com.tievd.jyz.service.IOiloutRecordService; 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; import java.util.Date; /** * 卸油算法处理类 * @author timi */ @Slf4j @Component public class OilAlgHandler implements AlgHandleInterface { /** 卸油算法标识头 */ private final String[] ALG_TAG = new String[]{ "X10001", "X10002", "X10003", "X10004", "X10005", "X10006", "X10007", "X10008"}; private final String lastAlgTag = "X10008"; @Override public String[] getAlgTag(){ return ALG_TAG; } @Autowired private IOiloutEventService oiloutEventService; @Autowired private IOiloutRecordService oiloutRecordService; @Autowired private CameraMapper cameraMapper; @Autowired private MqttCommandReceiver mqttCommandReceiver; @Value("${init.sendCommandTopic:/ty/aibox/command/}") private String sendCommandTopic; /** * 处理入口 * @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(); //车牌 String plateNumber = ""; Device device = DeviceCache.getDeviceBySn(sn); if(ObjectUtil.isNull(device)){ log.error("网关设备不存在,sn:{}",sn); return; } SysAlgorithmItem sysAlgorithmItem = AlgorithmCache.getAlgorithmMap(algCode); if(ObjectUtil.isNull(sysAlgorithmItem)){ log.error("算法类型不存在,algCode:{}",algCode); return; } SysDepart sysDepart = DepartCache.getDepartByOrgCode(device.getOrgCode()); if(ObjectUtil.isNull(sysDepart)){ log.error("机构不存在,orgCode:{}",device.getOrgCode()); return; } //上传信息中无车牌号,暂时使用第三方的processId作为id传入记录中 OiloutRecord oiloutRecord = BeanUtil.copyProperties(eventInfoDTO.getExtend(), OiloutRecord.class); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(oiloutRecord).eq(OiloutRecord::getOrgCode, device.getOrgCode()).isNull(OiloutRecord::getEndTime); OiloutRecord recordSelect = oiloutRecordService.getOne(wrapper, false); if(ObjectUtil.isNull(recordSelect)){ oiloutRecord = oilOutRecordGen(oiloutRecord, plateNumber,System.currentTimeMillis(),cameraCode,device.getId(), device.getName(),sysDepart); oiloutRecordService.save(oiloutRecord); } else { oiloutRecord = recordSelect; } OiloutEvent oiloutEvent = oiloutEventService.getOne(new LambdaQueryWrapper().eq(OiloutEvent::getRecordId,oiloutRecord.getId()).eq(OiloutEvent::getAlgorithmCode,algCode), false); if(ObjectUtil.isNotNull(oiloutEvent)){ return; } oiloutEvent = oilOutEventGen( eventCode, sysAlgorithmItem, device, sysDepart, cameraCode, time, SystemConstant.OILOUT_EVETN_TYPE_RIGHT.byteValue()); //将扩展信息的图片和是否合规赋值 BeanUtil.copyProperties(eventInfoDTO.getExtend(), oiloutEvent); oiloutEvent.setId(null); oiloutEvent.setRecordId(oiloutRecord.getId()); oiloutEventService.save(oiloutEvent); //请求图片和短视频 // 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("事件图片视频指令发送失败"); // } //第三方上报顺序不一致,取消阶段检测 // if(sysAlgorithmItem.getPhraseSymbol() == (byte)1){ // //为阶段标志 // if(sysAlgorithmItem.getPhrase() > SystemConstant.OILOUT_EVENT_PHRASE_FRONT){ // //为阶段标志,完善之前阶段事件数据 // List algorithmItemList = AlgorithmCache.getPhraseAlgorithmMap((byte) (sysAlgorithmItem.getPhrase()-1)); // for(SysAlgorithmItem sysAlgorithmItem1:algorithmItemList){ // OiloutEvent tmpOiloutEvent = oiloutEventService.getOne(new QueryWrapper().eq("record_id",oiloutRecord.getId()).eq("algorithm_code",sysAlgorithmItem1.getAlgorithmCode()), false); // if(ObjectUtil.isNull(tmpOiloutEvent)){ // tmpOiloutEvent = oilOutEventGen(RandomUtil.randomNumbers(10), sysAlgorithmItem1,device, sysDepart, cameraCode, time, SystemConstant.OILOUT_EVETN_TYPE_ERROR.byteValue()); // tmpOiloutEvent.setRecordId(oiloutRecord.getId()); // tmpOiloutEvent.setImgPath(oiloutEvent.getImgPath()); // oiloutEventService.save(tmpOiloutEvent); // //TODO 请求图片视频 // // } // } // } // }else{ // // } if(lastAlgTag.equals(algCode)){ oiloutRecord.setEndTime(new Timestamp(System.currentTimeMillis())); int spandTime = (int) (oiloutRecord.getEndTime().getTime() - oiloutRecord.getStartTime().getTime())/1000/60; oiloutRecord.setSpandTime(spandTime); oiloutRecordService.updateById(oiloutRecord); } } /** * 卸油记录生成 * @param plateNumber * @param startTime * @param cameraCode * @param deviceId * @param sysDepart * @return */ private OiloutRecord oilOutRecordGen(OiloutRecord oiloutRecord, String plateNumber, Long startTime,String cameraCode,Long deviceId, String deviceName,SysDepart sysDepart){ oiloutRecord.setCameraCode(cameraCode); oiloutRecord.setDeviceId(deviceId); oiloutRecord.setOrgCode(sysDepart.getOrgCode()); oiloutRecord.setOrgName(sysDepart.getDepartName()); oiloutRecord.setLicenseNum(plateNumber); oiloutRecord.setStartTime(new Timestamp(startTime)); oiloutRecord.setCreateTime(new Date()); return oiloutRecord; } /** * 卸油事件生成 * @param eventCode * @param sysAlgorithmItem * @param device * @param sysDepart * @param cameraCode * @param time * @param eventType * @return */ private OiloutEvent oilOutEventGen(String eventCode, SysAlgorithmItem sysAlgorithmItem, Device device,SysDepart sysDepart, String cameraCode, String time,Byte eventType){ Camera camera = cameraMapper.selectOne(new QueryWrapper().eq("code",cameraCode).eq("device_id",device.getId())); if(ObjectUtil.isNull(camera)){ return null; } OiloutEvent oiloutEvent = new OiloutEvent(); oiloutEvent.setAlgorithmCode(sysAlgorithmItem.getAlgorithmCode()); oiloutEvent.setAlgorithmName(sysAlgorithmItem.getAlgorithmName()); oiloutEvent.setEventType(eventType); oiloutEvent.setEventPhrase(sysAlgorithmItem.getPhrase()); oiloutEvent.setCameraCode(camera.getCode()); oiloutEvent.setCameraName(camera.getName()); oiloutEvent.setDeviceId(device.getId()); oiloutEvent.setDeviceName(device.getName()); oiloutEvent.setOrgCode(sysDepart.getOrgCode()); oiloutEvent.setEventDay(LocalDate.now().format(SystemConstant.DATE_DAY_FORMATTER)); oiloutEvent.setOrgName(sysDepart.getDepartName()); oiloutEvent.setEventTime(new Timestamp(Long.parseLong(time))); oiloutEvent.setImgUid(eventCode); oiloutEvent.setCreateTime(new Timestamp(System.currentTimeMillis())); return oiloutEvent; } }