package com.ycl.service.video.impl; import com.alibaba.druid.util.StringUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.dto.video.*; import com.ycl.entity.video.VideoAlarmReport; import com.ycl.mapper.video.VideoAlarmReportMapper; import com.ycl.service.caseHandler.IViolationsService; import com.ycl.service.oss.OssService; import com.ycl.service.video.IVideoAlarmReportService; import com.ycl.utils.MediaFileUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.imageio.ImageIO; import javax.xml.bind.DatatypeConverter; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.function.Consumer; /** * VideoAlarmReportServiceImpl * * @version V1.0 * @author: AI * @date: 2022-09-20 17:36 **/ @Service public class VideoAlarmReportServiceImpl extends ServiceImpl implements IVideoAlarmReportService { private MediaFileUtil mediaFileUtil; private IViolationsService violationsService; @Autowired private OssService ossService; @Autowired public void setMediaFileUtil(MediaFileUtil mediaFileUtil) { this.mediaFileUtil = mediaFileUtil; } @Autowired public void setViolationsService(IViolationsService violationsService) { this.violationsService = violationsService; } // @Override // public void save(AlarmParam alarmParam) { // if (alarmParam != null && alarmParam.getAlarmData() != null) { // CameraInfParam cameraInf = alarmParam.getCameraInf(); // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); // String picData = ""; // if (!StringUtils.isEmpty(alarmParam.getPicData())) { //// String[] strings = alarmParam.getPicData().split(","); // String extension = "jpg"; // // byte[] data = DatatypeConverter.parseBase64Binary(alarmParam.getPicData()); // InputStream inputStream = new ByteArrayInputStream(data); // // try { // if (!StringUtils.isEmpty(alarmParam.getAlarmData().getAlarmObject().toString())) { // String alarmObject = JSON.toJSONString(alarmParam.getAlarmData().getAlarmObject()); // if (!StringUtils.isEmpty(alarmObject)) { // BufferedImage image = ImageIO.read(inputStream); // // Graphics2D g2 = (Graphics2D) image.getGraphics(); // g2.setColor(Color.RED); // g2.setStroke(new BasicStroke(3.0f)); // List alarmObjects = JSON.parseArray(alarmObject, AlarmObject.class); // alarmObjects.forEach(o -> { // o.getObjectRect().forEach(rect -> { // g2.drawRect(rect.getX(), rect.getY(), rect.getW(), rect.getH()); // }); // }); // ByteArrayOutputStream os = new ByteArrayOutputStream(); // ImageIO.write(image, extension, os); // inputStream = new ByteArrayInputStream(os.toByteArray()); // } // } // picData = mediaFileUtil.savePicture(inputStream, extension); // } catch (Exception e) { // e.printStackTrace(); // } // } // List videoAlarmReports = new ArrayList<>(); // // AlarmDataParam alarmData = alarmParam.getAlarmData(); // List list = getByAlarmId(alarmData.getAlarmID()); // try { // Date date = sdf.parse(alarmData.getAlarmTime()); // Instant instant = date.toInstant(); // ZoneId zoneId = ZoneId.systemDefault(); // VideoAlarmReport videoAlarmReport = VideoAlarmReport.builder() // .ip(cameraInf.getIp()).port(cameraInf.getPort()) // .user(cameraInf.getUser()).password(cameraInf.getPassword()) // .channel(cameraInf.getChannel()).platResourceId(cameraInf.getPlatResourceID()) // .picData(picData).alarmTime(instant.atZone(zoneId).toLocalDateTime()) // .alarmId(alarmData.getAlarmID()).algoType(alarmData.getAlgoType()) // .alarmType(alarmData.getAlarmType()).alarmName(alarmData.getAlarmName()) // .algoName(alarmData.getAlgoName()).alarmObj(JSON.toJSONString(alarmData.getAlarmObject())) // .build(); // if (list.size() == 0) { // // videoAlarmReports.add(videoAlarmReport); // // this.saveBatch(videoAlarmReports, videoAlarmReports.size()); // // violationsService.saveFromVideo(videoAlarmReports); // // } else { // videoAlarmReport.setId(list.get(0).getId()); // this.updateById(videoAlarmReport); // } // } catch (ParseException e) { // e.printStackTrace(); // } // } // } @Override public void save(AlarmParam alarmParam) { if (alarmParam != null && alarmParam.getAlarmData() != null) { // 取出CameraInf CameraInfParam cameraInf = alarmParam.getCameraInf(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); String picData = ""; if (!StringUtils.isEmpty(alarmParam.getPicData())) { // String[] strings = alarmParam.getPicData().split(","); String extension = "jpg"; // 按照Base64编码解析数据 byte[] data = DatatypeConverter.parseBase64Binary(alarmParam.getPicData()); InputStream inputStream = new ByteArrayInputStream(data); try { // 如果List合理 if (alarmParam.getAlarmData() != null && alarmParam.getAlarmData().size() != 0) { BufferedImage image = ImageIO.read(inputStream); Graphics2D g2 = (Graphics2D) image.getGraphics(); g2.setColor(Color.RED); g2.setStroke(new BasicStroke(3.0f)); List alarmData = alarmParam.getAlarmData(); alarmData.forEach(new Consumer() { @Override public void accept(AlarmDataParam alarmDataParam) { List alarmObject = alarmDataParam.getAlarmObject(); alarmObject.forEach(new Consumer() { @Override public void accept(AlarmObject alarmObject) { ObjectRect rect = alarmObject.getObjectRect(); g2.drawRect(rect.getX(), rect.getY(), rect.getW(), rect.getH()); } }); } }); ByteArrayOutputStream os = new ByteArrayOutputStream(); ImageIO.write(image, extension, os); inputStream = new ByteArrayInputStream(os.toByteArray()); } picData = ossService.uploadImages(inputStream, extension); } catch (Exception e) { System.out.println("保存报警数据失败---图片上传失败:" + e.getMessage()); // e.printStackTrace(); } } List videoAlarmReports = new ArrayList<>(); List alarmData = alarmParam.getAlarmData(); for (AlarmDataParam alarmDatum : alarmData) { List list = getByAlarmId(alarmDatum.getAlarmID()); try { Date date = sdf.parse(alarmDatum.getAlarmTime()); Instant instant = date.toInstant(); ZoneId zoneId = ZoneId.systemDefault(); VideoAlarmReport videoAlarmReport = VideoAlarmReport.builder() .ip(cameraInf.getIp()).port(cameraInf.getPort()) .user(cameraInf.getUser()).password(cameraInf.getPassword()) .channel(cameraInf.getChannel()).platResourceId(cameraInf.getPlatResourceID()) .picData(picData).alarmTime(instant.atZone(zoneId).toLocalDateTime()) .alarmId(alarmDatum.getAlarmID()).algoType(alarmDatum.getAlgoType()) .alarmType(alarmDatum.getAlarmType()).alarmName(alarmDatum.getAlarmName()) .algoName(alarmDatum.getAlgoName()).alarmObj(JSON.toJSONString(alarmDatum.getAlarmObject())) .build(); if (list.size() == 0) { videoAlarmReports.add(videoAlarmReport); this.saveBatch(videoAlarmReports, videoAlarmReports.size()); violationsService.saveFromVideo(videoAlarmReports); } else { videoAlarmReport.setId(list.get(0).getId()); this.updateById(videoAlarmReport); } } catch (ParseException e) { System.out.println("保存报警数据失败:" + e.getMessage()); // e.printStackTrace(); } } } } @Override public void saveFromHK(HKAlarmParam alarmParam) { if (alarmParam != null) { violationsService.saveFromHKVideo(alarmParam); } } @Override public List findByChannelAndAlarmNameAndTime(String channel, String alarmName, LocalDateTime alarmTime) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(VideoAlarmReport::getChannel, channel).eq(VideoAlarmReport::getAlarmName, alarmName) .between(VideoAlarmReport::getAlarmTime, alarmTime.plusMinutes(-3), alarmTime.plusMinutes(3)); return this.list(queryWrapper); } private List getByAlarmId(String alarmId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper().eq(VideoAlarmReport::getAlarmId, alarmId); return this.list(queryWrapper); } }