fuliqi
2024-10-10 d268f82d25c25ebdc7a1ea30614f6cda6d3a9ae3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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<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)
                .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);
            }
        }    }
 
}