fuliqi
2024-10-10 d268f82d25c25ebdc7a1ea30614f6cda6d3a9ae3
ycl-server/src/main/java/com/ycl/task/WorkOrderImgTask.java
@@ -1,20 +1,31 @@
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;
@@ -37,20 +48,63 @@
    private final DeviceInfoMapper deviceInfoMapper;
    private final WorkOrderCheckImgMapper workOrderCheckImgMapper;
    private static final ExecutorService executorService = new ThreadPoolExecutor(8,
            24,
            5000,
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(10),
            new ThreadPoolExecutor.CallerRunsPolicy()
    );
//    private static final ExecutorService executorService = new ThreadPoolExecutor(8,
//            10,
//            5000,
//            TimeUnit.SECONDS,
//            new ArrayBlockingQueue<>(1024),
//            new ThreadPoolExecutor.CallerRunsPolicy()
//    );
    public void run() {
        // 查出故障的设备
        List<DeviceInfoVO> deviceList = workOrderService.hasErrorWorkOrderList();
    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<DeviceInfoVO> deviceList = workOrderService.hasErrorWorkOrderList(DateUtils.getDayStart(ca.getTime()), DateUtils.getDayEnd(now));
        if (CollectionUtils.isEmpty(deviceList)) {
            return;
        }
        log.info("此次共检测工单图片工单数" + deviceList.size());
        // 查出国标设备,就一条数据
        List<DeviceInfo> gbDevices = new LambdaQueryChainWrapper<>(deviceInfoMapper)
                .orderByDesc(DeviceInfo::getUpdateTime)
@@ -60,18 +114,21 @@
            return;
        }
        for (DeviceInfoVO deviceInfo : deviceList) {
//            executorService.submit(() -> {
                // 国标设备的编码就是取视频流的设备编码,国标设备就一个。国标设备的每一个通道代表一个摄像头,也就是设备id是取流的通道id
                String frameImg = workOrderService.getFrameImgByDevice(gbDevices.get(0).getDeviceId(), deviceInfo.getDeviceId(), deviceInfo.getWorkOrderNo());
                if (StringUtils.hasText(frameImg)) {
                    WorkOrderCheckImg img = new WorkOrderCheckImg();
                    img.setWorkOrderNo(deviceInfo.getWorkOrderNo());
                    img.setImgUrl(frameImg);
                    img.setCreateTime(new Date());
                    workOrderCheckImgMapper.insert(img);
                }
//            });
        }
    }
            // 国标设备的编码就是取视频流的设备编码,国标设备就一个。国标设备的每一个通道代表一个摄像头,也就是设备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);
            }
        }    }
}