ycl-server/src/main/java/com/ycl/platform/service/WorkOrderService.java
@@ -191,7 +191,17 @@ String getFrameImgByDevice(String deviceId, String channelId, String workOrderNo); /** * 查询工单:已下发、已处理、已完成的工单 * 工单设备点播获取一帧图片,并保存到数据库 * * @param deviceId 国标设备国标码 * @param channelId 设备通道编号(设备国标码) * @param workOrderNo 工单号 * @return 数据 */ void saveFrameImgByDevice(String deviceId, String channelId, String workOrderNo); /** * 查询工单:待审核的工单 * * @param start 开始时间 * @param end 结束时间 ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -725,6 +725,67 @@ } @Override public void saveFrameImgByDevice(String deviceId, String channelId, String workOrderNo) { String url = String.format(this.rtspServer + "/api/play/start/%s/%s", deviceId, channelId); String result = HttpUtils.sendGet(url); 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 = FFmpegFrameGrabber.createDefault(rtspUrl); //设置10s超时 grabber.setTimeout(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(); } // 通常不需要调用release(),因为stop()会处理资源释放 // grabber.release(); // 释放资源 } } } } else { System.out.println("请求失败,错误码:" + wvpResult.getCode()); } System.out.println("图片URL:" + imgUrl); if (StringUtils.hasText(imgUrl)) { WorkOrderCheckImg img = new WorkOrderCheckImg(); img.setWorkOrderNo(workOrderNo); img.setImgUrl(imgUrl); img.setCreateTime(new Date()); workOrderCheckImgMapper.insert(img); } } @Override public List<DeviceInfoVO> hasErrorWorkOrderList(Date start, Date end) { List<DeviceInfoVO> list = baseMapper.hasErrorWorkOrderList(start, end); return list; ycl-server/src/main/java/com/ycl/task/WorkOrderImgTask.java
@@ -39,13 +39,13 @@ private final DeviceInfoMapper deviceInfoMapper; private final WorkOrderCheckImgMapper workOrderCheckImgMapper; private static final ExecutorService executorService = new ThreadPoolExecutor(16, 128, 5000, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000), new ThreadPoolExecutor.CallerRunsPolicy() ); // private static final ExecutorService executorService = new ThreadPoolExecutor(8, // 10, // 5000, // TimeUnit.SECONDS, // new ArrayBlockingQueue<>(1024), // new ThreadPoolExecutor.CallerRunsPolicy() // ); public void run() { // 查出最近一周的故障的设备 @@ -66,17 +66,15 @@ 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 = 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); } } } ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -238,7 +238,7 @@ FROM t_work_order wo WHERE wo.create_time BETWEEN #{start} AND #{end} wo.create_time BETWEEN #{start} AND #{end} AND wo.status = 'AUDITING' AND deleted = 0 </select>