xiangpei
2024-08-29 3e9a6da99aae968123ee7bca352fc08becd7f1f2
ycl-server/src/main/java/com/ycl/platform/service/impl/WorkOrderServiceImpl.java
@@ -1,6 +1,7 @@
package com.ycl.platform.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
@@ -12,10 +13,7 @@
import com.ycl.platform.domain.entity.*;
import com.ycl.platform.domain.form.*;
import com.ycl.platform.domain.query.*;
import com.ycl.platform.domain.vo.DeviceInfoVO;
import com.ycl.platform.domain.vo.DistributeWorkOrderVO;
import com.ycl.platform.domain.vo.WorkOrderVO;
import com.ycl.platform.domain.vo.WorkOrderYwConditionRecordVO;
import com.ycl.platform.domain.vo.*;
import com.ycl.platform.domain.vo.screen.ScreenWorkOrderVO;
import com.ycl.platform.domain.vo.screen.WorkOrderRegionVO;
import com.ycl.platform.domain.vo.screen.WorkOrderTotalVO;
@@ -37,6 +35,7 @@
import com.ycl.utils.http.HttpUtils;
import com.ycl.utils.redis.RedisCache;
import com.ycl.utils.uuid.IdUtils;
import constant.Constants;
import enumeration.general.NotifyTypeEnum;
import enumeration.general.UrgentLevelEnum;
import enumeration.general.WorkOrderDistributeWayEnum;
@@ -44,9 +43,9 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.bytedeco.javacv.FFmpegFrameGrabber;
import org.bytedeco.javacv.Frame;
import org.bytedeco.javacv.Java2DFrameConverter;
import org.bytedeco.javacv.*;
import org.bytedeco.opencv.global.opencv_imgcodecs;
import org.bytedeco.opencv.opencv_core.Mat;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -57,6 +56,7 @@
import org.springframework.util.StringUtils;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
@@ -130,7 +130,7 @@
        for (WorkOrder workOrder : workOrderList) {
            WorkOrder databaseWorkOrder = mapping.get(workOrder.getSerialNumber());
            if (Objects.nonNull(databaseWorkOrder)) {
                List<String> errorNameList = workOrderErrorTypeService.getBaseMapper().getNotFinishWorkOrderErrors(workOrder.getWorkOrderNo());
                List<String> errorNameList = workOrderErrorTypeService.getBaseMapper().getNotFinishWorkOrderErrors(databaseWorkOrder.getWorkOrderNo());
                List<String> errorTypes = workOrder.getErrorTypeList();
                if (errorNameList.containsAll(errorTypes)) {
                    // 如果,国标码、故障类型都一样,则跳过不处理
@@ -177,6 +177,7 @@
        if (willAddMsg.size() > 0) {
            workOrderYwConditionRecordMapper.insertMany(willAddMsg);
        }
        log.info("将要更新的工单数:" + willUpdateStatusWorkOrderList.size());
        if (willUpdateStatusWorkOrderList.size() > 0) {
            this.baseMapper.updateMany(willUpdateStatusWorkOrderList);
        }
@@ -391,23 +392,22 @@
    }
    @Override
    public Result selectYwConditionByYwId(String workOrderNo) {
    public List<WorkOrderYwConditionRecordVO> selectYwConditionByYwId(String workOrderNo) {
        List<WorkOrderYwConditionRecordVO> ywConditionList = workOrderYwConditionRecordMapper.selectYwConditionByYwId(workOrderNo);
        ywConditionList.stream().forEach(item -> {
            if (Objects.nonNull(item.getSysMsg()) && item.getSysMsg()) {
                item.setCommitUserName("系统消息");
            }
        });
        return Result.ok().data(ywConditionList);
        return ywConditionList;
    }
    @Override
    public Result selectYwAuditingListByYwId(String workOrderNo) {
        return Result.ok().data(
                new LambdaQueryChainWrapper<>(workOrderAuditingRecordMapper)
    public List<WorkOrderAuditingRecord> selectYwAuditingListByYwId(String workOrderNo) {
        return new LambdaQueryChainWrapper<>(workOrderAuditingRecordMapper)
                        .eq(WorkOrderAuditingRecord::getWorkOrderNo, workOrderNo)
                        .orderByAsc(WorkOrderAuditingRecord::getCreateTime)
                        .list());
                        .list();
    }
    @Override
@@ -661,41 +661,56 @@
    @Override
    public String getFrameImgByDevice(String deviceId, String channelId) {
    public String getFrameImgByDevice(String deviceId, String channelId, String workOrderNo) {
        String url = String.format(this.rtspServer + "/api/play/start/%s/%s", deviceId, channelId);
        String result = HttpUtils.sendGet(url);
        log.error("拿到取流响应结果:" + result);
        WVPResult wvpResult = JSON.parseObject(result, WVPResult.class);
        if (0 == wvpResult.getCode()) {
            log.error("请求成功");
            StreamContent data = (StreamContent) wvpResult.getData();
            log.error("拿到取流响应结果:" + data);
            String rtspUrl = data.getRtsp();
        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 {
                    // 创建FFmpegFrameGrabber对象
                    FFmpegFrameGrabber grabber = new FFmpegFrameGrabber(rtspUrl);
                    grabber.start(); // 开始捕获
                    grabber = FFmpegFrameGrabber.createDefault(rtspUrl);
                    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);
                    Frame frame;
                    if ((frame = grabber.grabFrame()) != null) {
                        // 将帧转换为图片
                        Java2DFrameConverter converter = new Java2DFrameConverter();
                        BufferedImage image = converter.convert(frame);
                        File outputfile = new File(serverConfig.getUrl() + PlatformConfig.getUploadPath() + deviceId + IdUtils.fastSimpleUUID() + ".png");
                        ImageIO.write(image, "png", outputfile);
                        String imgPath = outputfile.getAbsolutePath();
                        System.out.println("Saved " + imgPath);
                        return imgPath;
                        imgUrl = workOrderNo + "_" + IdUtils.fastSimpleUUID() + ".png";
                        // 生成图片路径
                        String imgPath = PlatformConfig.getUploadPath() + "/" + imgUrl;
                        System.out.println("图片保存地址:" + imgPath);
                        imgUrl = Constants.RESOURCE_PREFIX + "/" + imgUrl;
                        // 保存图片
                        opencv_imgcodecs.imwrite(imgPath, mat);
                    } else {
                        System.out.println("未捕获到帧");
                    }
                    grabber.stop(); // 停止捕获
                    grabber.release(); // 释放资源
                } catch (IOException e) {
                } 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());
        }
        return null;
        System.out.println("图片URL:" + imgUrl);
        return imgUrl;
    }
    @Override
@@ -708,6 +723,19 @@
    public void updateImgById(Integer workOrderId, String imgPath) {
        new LambdaUpdateChainWrapper<>(baseMapper)
                .eq(WorkOrder::getId, workOrderId)
                .set(WorkOrder::getYwCheckResult, imgPath);
                .set(WorkOrder::getYwCheckResult, imgPath)
                .update();
    }
    @Override
    public Result processImg(String workOrderNo) {
        // 运维记录
        List<WorkOrderYwConditionRecordVO> workOrderYwConditionRecordVOS = this.selectYwConditionByYwId(workOrderNo);
        // 审核记录
        List<WorkOrderAuditingRecord> workOrderAuditingRecords = this.selectYwAuditingListByYwId(workOrderNo);
        WorkOrderProcessVO process = new WorkOrderProcessVO();
        process.setYwList(workOrderYwConditionRecordVOS);
        process.setAuditingList(workOrderAuditingRecords);
        return Result.ok().data(process);
    }
}