fuliqi
2024-10-16 44cd2d171062c9b07a0eb047cd0ac80d06188e8c
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -211,6 +211,25 @@
        List<WorkOrder> notAddList = new ArrayList<>();
        //查redis今日工单数量
        int workOrderNum = 0;
        for (WorkOrder workOrder : waitAddList) {
            YwPoint point = pointMapping.get(workOrder.getSerialNumber());
            if (Objects.isNull(point)) {
                notAddList.add(workOrder);
                continue;
            }
            if (Objects.nonNull(point.getUnitId())) {
                workOrder.setUnitId(Math.toIntExact(point.getUnitId()));
            }
            if (point.getImportantTag() || point.getImportantCommandImageTag()) {
                workOrder.setProcessingPeriod(Integer.valueOf(important.getConfigValue()));
            } else {
                workOrder.setProcessingPeriod(Integer.valueOf(normal.getConfigValue()));
            }
        }
        waitAddList.removeAll(notAddList);
        if (CollectionUtils.isEmpty(waitAddList)) {
            return Boolean.TRUE;
        }
        //UUID作为value,保证上锁的线程自己解锁
        String requestId = IdUtils.fastSimpleUUID();
        try {
@@ -234,23 +253,11 @@
            log.error("获取锁异常");
            return Boolean.FALSE;
        }
        //记录工单数,补充工单号
        for (WorkOrder workOrder : waitAddList) {
            YwPoint point = pointMapping.get(workOrder.getSerialNumber());
            if (Objects.isNull(point)) {
                notAddList.add(workOrder);
                continue;
            }
            //数字前面补0
            workOrderNum++;
            workOrder.setWorkOrderNo(IdUtils.workOrderNO(now, String.format("%05d", workOrderNum)));
            if (Objects.nonNull(point.getUnitId())) {
                workOrder.setUnitId(Math.toIntExact(point.getUnitId()));
            }
            if (point.getImportantTag() || point.getImportantCommandImageTag()) {
                workOrder.setProcessingPeriod(Integer.valueOf(important.getConfigValue()));
            } else {
                workOrder.setProcessingPeriod(Integer.valueOf(normal.getConfigValue()));
            }
            // 保存错误类型
            for (String errorType : workOrder.getErrorTypeList()) {
                WorkOrderErrorType workOrderErrorType = new WorkOrderErrorType();
@@ -260,12 +267,8 @@
                workOrderErrorType.setErrorName(errorType);
                waitAddErrorTypeList.add(workOrderErrorType);
            }
            log.info("即将生成的工单:{}",workOrder);
        }
        waitAddList.removeAll(notAddList);
        if (CollectionUtils.isEmpty(waitAddList)) {
            return Boolean.TRUE;
        }
        //记录工单数
        redisCache.setCacheObject(RedisConstant.WORKORDER_NUM, workOrderNum);
        redisCache.releaseLock(RedisConstant.WORKORDER_NUM_LOCK, requestId);
        // 保存工单和故障类型
@@ -764,51 +767,64 @@
    @Override
    public synchronized String getFrameImgByDevice(String deviceId, String channelId, String workOrderNo) throws Exception {
        String url = String.format(this.rtspServer + "/api/play/start/%s/%s", deviceId, channelId);
        String url = String.format(this.rtspServer + "/api/play/start/img/%s/%s", deviceId, channelId);
        String result = HttpUtils.sendGet(url);
        log.error("拿到取流响应结果:" + result);
        log.info("拿到取流图片响应结果:" + result);
        WVPResult wvpResult = JSON.parseObject(result, WVPResult.class);
        String imgUrl = null;
        if (0 == wvpResult.getCode()) {
            log.error("请求成功");
            JSONObject data = (JSONObject) wvpResult.getData();
            String rtspUrl = data.getString("rtsp"); // 取地址
            log.error("目标地址:" + rtspUrl);
            FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtspUrl);
            if (StringUtils.hasText(rtspUrl)) {
                try {
//                    grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重
                    grabber.setImageWidth(1920);
                    grabber.setImageHeight(1080);
                    grabber.setFrameRate(25);
                    grabber.start();
                    Frame frame = grabber.grabFrame();
                    if (frame != null) {
                        //转换图像
                        Java2DFrameConverter converter = new Java2DFrameConverter();
                        BufferedImage srcImage = converter.getBufferedImage(frame);
                        if (srcImage != null) {
                            imgUrl = workOrderNo + "_" + IdUtils.fastSimpleUUID() + ".png";
                            // 生成图片路径
                            String imgPath = PlatformConfig.getProfile() + "/" + imgUrl;
                            System.out.println("图片保存地址:" + imgPath);
                            imgUrl = Constants.RESOURCE_PREFIX + "/" + imgUrl;
                            //创建文件
                            File file = new File(imgPath);
                            //输出文件
                            ImageIO.write(srcImage, "png", file);
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    grabber.stop(); // 停止捕获
                    grabber.close(); // 释放资源
                }
            }
        if(wvpResult.getCode() == 0) {
            Object imgUrl = (Object) wvpResult.getData();
            imgUrl = Objects.isNull(imgUrl) ? "" : imgUrl;
            log.info("拿到取流图片:" + imgUrl);
            return (String) imgUrl;
        }
        return imgUrl;
        return null;
//        WVPResult wvpResult = JSON.parseObject(result, WVPResult.class);
//        String imgUrl = null;
//        if (wvpResult.getCode() == 0) {
//            JSONObject data = (JSONObject) wvpResult.getData();
//            String rtspUrl = data.getString("fmp4"); // 取mp4地址
//            if (StringUtils.hasText(rtspUrl)) {
//                System.out.println("目标地址:" + rtspUrl);
//                FFmpegFrameGrabber grabber = null;
//                try {
//                    grabber = new FFmpegFrameGrabber(rtspUrl);
////                    grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重
////                    grabber.setVideoOption("probesize", "10000"); // 设置捕获分析的最大字节
//                    grabber.start();
//                    Frame frame = grabber.grabImage(); // 直接捕获一帧
//                    if (frame != null) {
//                        System.out.println("成功捕获一帧");
//                        // 将Frame转换为Mat
//                        OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();
//                        Mat mat = converter.convertToMat(frame);
//
//                        imgUrl = workOrderNo + "_" + IdUtils.fastSimpleUUID() + ".png";
//                        // 生成图片路径
//                        String imgPath = PlatformConfig.getProfile() + "/" + imgUrl;
//                        System.out.println("图片保存地址:" + imgPath);
//                        imgUrl = Constants.RESOURCE_PREFIX + "/" + imgUrl;
//                        // 保存图片
//                        opencv_imgcodecs.imwrite(imgPath, mat);
//                    } else {
//                        System.out.println("未捕获到帧");
//                    }
//                } catch (FrameGrabber.Exception e) {
//                    e.printStackTrace();
//                } finally {
//                    if (grabber != null) {
//                        try {
//                            grabber.stop(); // 停止捕获
//                        } catch (FrameGrabber.Exception e) {
//                            e.printStackTrace();
//                        }
//                    }
//                }
//            }
//        } else {
//            System.out.println("请求失败,错误码:" + wvpResult.getCode() + "--" + wvpResult.getMsg());
//        }
//        System.out.println("图片URL:" + imgUrl);
//        return imgUrl;
    }
    @Override
@@ -819,7 +835,7 @@
        String imgUrl = null;
        if (wvpResult.getCode() == 0) {
            JSONObject data = (JSONObject) wvpResult.getData();
            String rtspUrl = data.getString("fmp4"); // 取mp4地址
            String rtspUrl = data.getString("rtsp"); // 取mp4地址
            if (StringUtils.hasText(rtspUrl)) {
                System.out.println("目标地址:" + rtspUrl);
                FFmpegFrameGrabber grabber = null;