package com.ycl.task; import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; import com.ycl.config.PlatformConfig; import com.ycl.platform.domain.entity.DeviceInfo; import com.ycl.platform.domain.entity.WorkOrderCheckImg; import com.ycl.platform.domain.vo.DeviceInfoVO; import com.ycl.platform.mapper.DeviceInfoMapper; import com.ycl.platform.mapper.WorkOrderCheckImgMapper; import com.ycl.platform.service.WorkOrderService; import com.ycl.utils.DateUtils; import com.ycl.utils.uuid.IdUtils; import constant.Constants; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Frame; import org.bytedeco.javacv.Java2DFrameConverter; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * 工单恢复图片获取 * * @author:xp * @date:2024/8/21 11:56 */ @Slf4j @RequiredArgsConstructor @Component("workOrderImgTask") public class WorkOrderImgTask { private final WorkOrderService workOrderService; private final DeviceInfoMapper deviceInfoMapper; private final WorkOrderCheckImgMapper workOrderCheckImgMapper; // private static final ExecutorService executorService = new ThreadPoolExecutor(8, // 10, // 5000, // TimeUnit.SECONDS, // new ArrayBlockingQueue<>(1024), // new ThreadPoolExecutor.CallerRunsPolicy() // ); public void run() throws FFmpegFrameGrabber.Exception { // String rtspUrl = "http://www.w3school.com.cn/i/movie.mp4"; // if (StringUtils.hasText(rtspUrl)) { // FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtspUrl); // try { //// grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重 // grabber.setImageWidth(1920); // grabber.setImageHeight(1080); // grabber.setFrameRate(25); // grabber.start(); // System.out.println("成功"); // Frame frame = grabber.grabImage(); // String imgUrl = null; // if (frame != null) { // System.out.println("成功2"); // //转换图像 // Java2DFrameConverter converter = new Java2DFrameConverter(); // BufferedImage srcImage = converter.getBufferedImage(frame); // System.out.println(srcImage); // if (srcImage != null) { // imgUrl = IdUtils.fastSimpleUUID() + ".png"; // // 生成图片路径 // String imgPath = "/" + imgUrl; // System.out.println("图片保存地址:" + imgPath); //// imgUrl = Constants.RESOURCE_PREFIX + "/" + imgUrl; // //创建文件 // File file = new File("D:\\Codes\\zgyw\\"+imgUrl); // //输出文件 // ImageIO.write(srcImage, "png", file); // } // } // } catch (IOException e) { // e.printStackTrace(); // } finally { // grabber.stop(); // 停止捕获 //// grabber.close(); // 释放资源 // } // } // 查出最近一周的故障的设备 Date now = new Date(); Calendar ca = Calendar.getInstance(); ca.setTime(now); ca.add(Calendar.DATE, -6); List deviceList = workOrderService.hasErrorWorkOrderList(DateUtils.getDayStart(ca.getTime()), DateUtils.getDayEnd(now)); if (CollectionUtils.isEmpty(deviceList)) { return; } log.info("此次共检测工单图片工单数" + deviceList.size()); // 查出国标设备,就一条数据 List gbDevices = new LambdaQueryChainWrapper<>(deviceInfoMapper) .orderByDesc(DeviceInfo::getUpdateTime) .last("limit 1") .list(); if (CollectionUtils.isEmpty(gbDevices)) { return; } for (DeviceInfoVO deviceInfo : deviceList) { // 国标设备的编码就是取视频流的设备编码,国标设备就一个。国标设备的每一个通道代表一个摄像头,也就是设备id是取流的通道id String frameImg = null; try { frameImg = workOrderService.getFrameImgByDevice(gbDevices.get(0).getDeviceId(), deviceInfo.getDeviceId(), deviceInfo.getWorkOrderNo()); } catch (Exception e) { e.printStackTrace(); continue; } if (StringUtils.hasText(frameImg)) { WorkOrderCheckImg img = new WorkOrderCheckImg(); img.setWorkOrderNo(deviceInfo.getWorkOrderNo()); img.setImgUrl(frameImg); img.setCreateTime(new Date()); workOrderCheckImgMapper.insert(img); } } } }