Browse Source

Merge branch 'test-merge' of http://219.151.181.73:3000/zhuwei/bladex into test-merge

lvy 5 ngày trước cách đây
mục cha
commit
63b2d1f241

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyFinishTestReport.java

@@ -128,6 +128,12 @@ public class TrialCyFinishTestReport {
     @ApiModelProperty("记录文件路径")
     @TableField("record_file_path")
     private String recordFilePath;
+    /**
+     * 试验树id
+     */
+    @ApiModelProperty("实验树Id")
+    @TableField("exam_name_info_id")
+    public String examNameInfoId;
     /**
      * 附件
      */

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/TrialCyThirdReport.java

@@ -263,6 +263,12 @@ public class TrialCyThirdReport {
     @ApiModelProperty("创建时间 格式如:“2022-06-21 13:44:33 235”")
     @TableField("create_time")
     public String createTime;
+    /**
+     * 试验树id
+     */
+    @ApiModelProperty("实验树Id")
+    @TableField("exam_name_info_id")
+    public String examNameInfoId;
 
     /**
      * 附件

+ 0 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TrialCyThirdReportQueryVo.java

@@ -20,7 +20,6 @@ public class TrialCyThirdReportQueryVo {
     @ApiModelProperty("树节点id")
     @NotNull(message = "树节点id不能为空")
     private Long nodeId;
-    private String nodeName;
     @ApiModelProperty("合同段id")
     @NotNull(message = "合同段id不能为空")
     private Long contractId;

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.xml

@@ -20,8 +20,8 @@
             <if test="query.contractId != null">
                 AND contract_id = #{query.contractId}
             </if>
-            <if test="query.nodeName != null">
-                AND process_name = #{query.nodeName}
+            <if test="query.nodeId != null">
+                AND exam_name_info_id = #{query.nodeId}
             </if>
             <if test="query.startTime != null">
                 AND report_date >= #{query.startTime}

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyThirdReportMapper.xml

@@ -28,8 +28,8 @@
             <if test="query.endTime != null">
                 AND report_date &lt;= #{query.endTime}
             </if>
-            <if test="query.nodeName != null">
-                AND sample_name = #{query.nodeName}
+            <if test="query.nodeId != null">
+                AND exam_name_info_id = #{query.nodeId}
             </if>
         </where>
     </select>

+ 5 - 4
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialCyServiceImpl.java

@@ -1,5 +1,6 @@
 package org.springblade.business.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import org.springblade.business.entity.TrialCyFinishTestReport;
@@ -59,10 +60,10 @@ public class TrialCyServiceImpl implements TrialCyService {
     @Override
     public Page<ThirdReportVo> getTrialDetectionReport(TrialCyThirdReportQueryVo queryVo) {
         TrialCyTestType byId = trialCyTestTypeService.getById(queryVo.getNodeId());
-        if(byId == null){
+        if(StringUtils.isBlank(byId.getId())){
             return new Page<>();
         }
-        queryVo.setNodeName(byId.getName());
+        queryVo.setNodeId(Long.valueOf(byId.getId()));
         Page<ThirdReportVo> page = trialCyFinishTestReportService.myPage(new Page<ThirdReportVo>(queryVo.getCurrent(), queryVo.getSize()),queryVo);
         return page;
     }
@@ -70,10 +71,10 @@ public class TrialCyServiceImpl implements TrialCyService {
     @Override
     public Page<ThirdReportVo> getThirdReport(TrialCyThirdReportQueryVo queryVo) {
         TrialCyTestType byId = trialCyTestTypeService.getById(queryVo.getNodeId());
-        if(byId == null){
+        if(StringUtils.isBlank(byId.getId())){
             return new Page<>();
         }
-        queryVo.setNodeName(byId.getName());
+        queryVo.setNodeId(Long.valueOf(byId.getId()));
         Page<ThirdReportVo> page = trialCyThirdReportService.myPage(new Page<ThirdReportVo>(queryVo.getCurrent(), queryVo.getSize()), queryVo);
         return page;
     }

+ 313 - 75
blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java

@@ -8,6 +8,7 @@ import com.drew.metadata.exif.ExifIFD0Directory;
 import com.itextpdf.text.Document;
 import com.itextpdf.text.pdf.PdfCopy;
 import com.itextpdf.text.pdf.PdfReader;
+import net.coobird.thumbnailator.Thumbnails;
 import org.apache.commons.lang.StringUtils;
 import org.apache.poi.ss.usermodel.ClientAnchor;
 import org.apache.poi.ss.usermodel.Sheet;
@@ -25,6 +26,7 @@ import javax.imageio.IIOImage;
 import javax.imageio.ImageIO;
 import javax.imageio.ImageWriteParam;
 import javax.imageio.ImageWriter;
+import javax.imageio.stream.ImageOutputStream;
 import javax.servlet.http.HttpServletResponse;
 import java.awt.*;
 import java.awt.geom.AffineTransform;
@@ -121,92 +123,328 @@ public class FileUtils {
         }
     }
 
-    /**
-     * 图片缩放、压缩、旋转处理
-     *
-     * @param imageData
-     * @return
-     * @throws IOException
-     * @throws ImageProcessingException
-     * @throws MetadataException
-     */
-    public static byte[] compressImage(byte[] imageData) throws IOException, ImageProcessingException, MetadataException {
-        // 读取原始图像(处理旋转问题)
-        Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(imageData));
-        if (metadata.containsDirectoryOfType(ExifIFD0Directory.class)) {
+//    /**
+//     * 图片缩放、压缩、旋转处理
+//     *
+//     * @param imageData
+//     * @return
+//     * @throws IOException
+//     * @throws ImageProcessingException
+//     * @throws MetadataException
+//     */
+//    public static byte[] compressImage(byte[] imageData) throws IOException, ImageProcessingException, MetadataException {
+//        // 读取原始图像(处理旋转问题)
+//        Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(imageData));
+//        if (metadata.containsDirectoryOfType(ExifIFD0Directory.class)) {
+//            ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
+//            if (exifIFD0Directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
+//                // 获取 Orientation 标签的值
+//                int orientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
+//                // 需要旋转图片
+//                BufferedImage originalImage = ImageIO.read(new ByteArrayInputStream(imageData));
+//                AffineTransform transform = new AffineTransform();
+//                if (orientation == 6) {
+//                    transform.rotate(Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
+//                } else if (orientation == 8) {
+//                    transform.rotate(-Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
+//                }
+//                AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
+//                originalImage = op.filter(originalImage, null);
+//                ByteArrayOutputStream baos = new ByteArrayOutputStream();
+//                ImageIO.write(originalImage, "jpg", baos);
+//                imageData = baos.toByteArray();
+//            }
+//        }
+//        // 缩放图像
+//        String formatName = "JPEG";
+//        ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
+//        BufferedImage originalImage = ImageIO.read(bais);
+//        long sizeLimit = 366912; //358KB
+//        int width = 768;
+//        int height = 1024;
+//        Image scaledImage = originalImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
+//        BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
+//        resizedImage.getGraphics().drawImage(scaledImage, 0, 0, null);
+//
+//        // 压缩图像
+//        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+//        ImageIO.write(resizedImage, formatName, baos);
+//
+//        if (baos.size() <= sizeLimit) {
+//            // 图片大小已经小于等于目标大小,直接返回原始数据
+//            return baos.toByteArray();
+//        }
+//
+//        float quality = 0.9f; // 初始化压缩质量
+//        int retries = 10; // 最多尝试 10 次
+//
+//        while (baos.size() > sizeLimit && retries > 0) {
+//            // 压缩图像并重新计算压缩质量
+//            byte[] data = baos.toByteArray();
+//            bais = new ByteArrayInputStream(data);
+//            BufferedImage compressedImage = ImageIO.read(bais);
+//            baos.reset();
+//
+//            ImageWriter writer = null;
+//            Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(formatName);
+//            if (writers.hasNext()) {
+//                writer = writers.next();
+//            } else {
+//                throw new IllegalArgumentException("Unsupported image format: " + formatName);
+//            }
+//
+//            ImageWriteParam writeParam = writer.getDefaultWriteParam();
+//            writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+//            writeParam.setCompressionQuality(quality);
+//
+//            writer.setOutput(ImageIO.createImageOutputStream(baos));
+//            writer.write(null, new IIOImage(compressedImage, null, null), writeParam);
+//            writer.dispose();
+//
+//            float ratio = sizeLimit * 1.0f / baos.size();
+//            quality *= Math.sqrt(ratio);
+//            retries--;
+//        }
+//
+//        return baos.toByteArray();
+//    }
+
+    public static byte[] compressImage(byte[] imageData) throws IOException {
+        // 读取元数据判断是否需要旋转
+        int orientation = 1;
+        try {
+            Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(imageData));
             ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
-            if (exifIFD0Directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
-                // 获取 Orientation 标签的值
-                int orientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
-                // 需要旋转图片
-                BufferedImage originalImage = ImageIO.read(new ByteArrayInputStream(imageData));
-                AffineTransform transform = new AffineTransform();
-                if (orientation == 6) {
-                    transform.rotate(Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
-                } else if (orientation == 8) {
-                    transform.rotate(-Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
-                }
-                AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
-                originalImage = op.filter(originalImage, null);
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                ImageIO.write(originalImage, "jpg", baos);
-                imageData = baos.toByteArray();
+            if (exifIFD0Directory != null && exifIFD0Directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
+                orientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
             }
-        }
-        // 缩放图像
-        String formatName = "JPEG";
-        ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
-        BufferedImage originalImage = ImageIO.read(bais);
-        long sizeLimit = 366912; //358KB
-        int width = 768;
-        int height = 1024;
-        Image scaledImage = originalImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
-        BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
-        resizedImage.getGraphics().drawImage(scaledImage, 0, 0, null);
-
-        // 压缩图像
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        ImageIO.write(resizedImage, formatName, baos);
-
-        if (baos.size() <= sizeLimit) {
-            // 图片大小已经小于等于目标大小,直接返回原始数据
-            return baos.toByteArray();
+        } catch (Exception e) {
+            // 元数据读取失败不影响主要流程
         }
 
-        float quality = 0.9f; // 初始化压缩质量
-        int retries = 10; // 最多尝试 10 次
-
-        while (baos.size() > sizeLimit && retries > 0) {
-            // 压缩图像并重新计算压缩质量
-            byte[] data = baos.toByteArray();
-            bais = new ByteArrayInputStream(data);
-            BufferedImage compressedImage = ImageIO.read(bais);
-            baos.reset();
-
-            ImageWriter writer = null;
-            Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(formatName);
-            if (writers.hasNext()) {
-                writer = writers.next();
-            } else {
-                throw new IllegalArgumentException("Unsupported image format: " + formatName);
+        // 使用Thumbnails处理旋转和压缩
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        long sizeLimit = 366912; // 358KB
+
+        try {
+            Thumbnails.of(new ByteArrayInputStream(imageData))
+                    .size(768, 1024)
+                    .outputFormat("jpg")
+                    .outputQuality(0.9)
+                    .useExifOrientation(true) // 自动处理EXIF旋转信息
+                    .toOutputStream(outputStream);
+
+            // 如果大小已满足要求,直接返回
+            if (outputStream.size() <= sizeLimit) {
+                return outputStream.toByteArray();
             }
 
-            ImageWriteParam writeParam = writer.getDefaultWriteParam();
-            writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
-            writeParam.setCompressionQuality(quality);
+            // 逐步降低质量直到满足大小要求
+            double quality = 0.8;
+            int attempts = 5;
 
-            writer.setOutput(ImageIO.createImageOutputStream(baos));
-            writer.write(null, new IIOImage(compressedImage, null, null), writeParam);
-            writer.dispose();
+            while (outputStream.size() > sizeLimit && attempts-- > 0) {
+                outputStream.reset();
+                Thumbnails.of(new ByteArrayInputStream(imageData))
+                        .size(768, 1024)
+                        .outputFormat("jpg")
+                        .outputQuality(quality)
+                        .useExifOrientation(true)
+                        .toOutputStream(outputStream);
 
-            float ratio = sizeLimit * 1.0f / baos.size();
-            quality *= Math.sqrt(ratio);
-            retries--;
-        }
+                quality *= 0.8; // 每次降低20%质量
+            }
 
-        return baos.toByteArray();
+            return outputStream.toByteArray();
+        } finally {
+            outputStream.close();
+        }
     }
 
+//    /**
+//     // * 图片缩放、压缩、旋转处理
+//     // *
+//     // * @param imageData
+//     // * @return
+//     // * @throws IOException
+//     // * @throws ImageProcessingException
+//     // * @throws MetadataException
+//     //     */
+//    public static byte[] compressImage(byte[] imageData) throws IOException {
+//        if (imageData == null || imageData.length == 0) {
+//            throw new IllegalArgumentException("图像数据不能为空");
+//        }
+//
+//        try {
+//            // 读取原始图像(处理旋转问题)
+//            Metadata metadata = ImageMetadataReader.readMetadata(new ByteArrayInputStream(imageData));
+//            if (metadata.containsDirectoryOfType(ExifIFD0Directory.class)) {
+//                ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
+//                if (exifIFD0Directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION)) {
+//                    // 获取 Orientation 标签的值
+//                    int orientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
+//                    // 需要旋转图片
+//                    BufferedImage originalImage = ImageIO.read(new ByteArrayInputStream(imageData));
+//                    if (originalImage == null) {
+//                        throw new IOException("无法读取图像数据");
+//                    }
+//
+//                    AffineTransform transform = new AffineTransform();
+//                    if (orientation == 6) {
+//                        transform.rotate(Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
+//                    } else if (orientation == 8) {
+//                        transform.rotate(-Math.PI / 2, originalImage.getWidth() / 2, originalImage.getHeight() / 2);
+//                    }
+//                    AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
+//                    originalImage = op.filter(originalImage, null);
+//                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
+//                    ImageIO.write(originalImage, "jpg", baos);
+//                    imageData = baos.toByteArray();
+//                }
+//            }
+//        } catch (Exception e) {
+//            // 如果EXIF处理失败,继续处理原始图像数据
+//            System.err.println("处理图像EXIF信息时出错: " + e.getMessage());
+//        }
+//
+//        // 缩放图像
+//        String formatName = "JPEG";
+//        ByteArrayInputStream bais = new ByteArrayInputStream(imageData);
+//        BufferedImage originalImage = ImageIO.read(bais);
+//
+//        if (originalImage == null) {
+//            throw new IOException("无法读取图像数据");
+//        }
+//
+//        // 确保图像是兼容的格式
+//        BufferedImage compatibleImage = convertToSupportedFormat(originalImage);
+//
+//        long sizeLimit = 366912; //358KB
+//        int width = 768;
+//        int height = 1024;
+//
+//        // 使用更高质量的缩放方法
+//        Image scaledImage = originalImage.getScaledInstance(width, height, Image.SCALE_SMOOTH);
+//        BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+//        Graphics2D g2d = resizedImage.createGraphics();
+//        g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+//        g2d.drawImage(scaledImage, 0, 0, null);
+//        g2d.dispose();
+//
+//        // 压缩图像
+//        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+//        try {
+//            boolean success = ImageIO.write(resizedImage, formatName, baos);
+//            if (!success) {
+//                throw new IOException("无法写入JPEG格式图像");
+//            }
+//        } catch (Exception e) {
+//            // 尝试使用ImageWriter直接写入
+//            writeImageWithDefaultSettings(resizedImage, baos, formatName);
+//        }
+//
+//        if (baos.size() <= sizeLimit) {
+//            // 图片大小已经小于等于目标大小,直接返回原始数据
+//            return baos.toByteArray();
+//        }
+//
+//        float quality = 0.9f; // 初始化压缩质量
+//        int retries = 10; // 最多尝试 10 次
+//
+//        while (baos.size() > sizeLimit && retries > 0) {
+//            // 压缩图像并重新计算压缩质量
+//            byte[] data = baos.toByteArray();
+//            bais = new ByteArrayInputStream(data);
+//            BufferedImage compressedImage = ImageIO.read(bais);
+//
+//            if (compressedImage == null) {
+//                throw new IOException("无法读取压缩后的图像数据");
+//            }
+//
+//            baos.reset();
+//
+//            ImageWriter writer = null;
+//            Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(formatName.toLowerCase());
+//            if (!writers.hasNext()) {
+//                // 尝试其他格式
+//                writers = ImageIO.getImageWritersByFormatName("jpeg");
+//            }
+//
+//            if (writers.hasNext()) {
+//                writer = writers.next();
+//            } else {
+//                throw new IllegalArgumentException("Unsupported image format: " + formatName);
+//            }
+//
+//            try {
+//                ImageWriteParam writeParam = writer.getDefaultWriteParam();
+//                if (writeParam.canWriteCompressed()) {
+//                    writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+//                    writeParam.setCompressionQuality(quality);
+//                }
+//
+//                try (ImageOutputStream ios = ImageIO.createImageOutputStream(baos)) {
+//                    writer.setOutput(ios);
+//                    writer.write(null, new IIOImage(compressedImage, null, null), writeParam);
+//                }
+//            } finally {
+//                writer.dispose();
+//            }
+//
+//            float ratio = sizeLimit * 1.0f / baos.size();
+//            quality *= Math.sqrt(ratio);
+//            retries--;
+//        }
+//
+//        return baos.toByteArray();
+//    }
+//
+//    /**
+//     * 转换图像为支持的格式
+//     */
+//    private static BufferedImage convertToSupportedFormat(BufferedImage image) {
+//        if (image == null) return null;
+//
+//        // 检查是否为支持的类型
+//        int type = image.getType();
+//        if (type != BufferedImage.TYPE_INT_RGB && type != BufferedImage.TYPE_INT_ARGB) {
+//            // 转换为支持的格式
+//            BufferedImage converted = new BufferedImage(
+//                    image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
+//            Graphics2D g = converted.createGraphics();
+//            g.setColor(Color.WHITE);
+//            g.fillRect(0, 0, converted.getWidth(), converted.getHeight());
+//            g.drawImage(image, 0, 0, null);
+//            g.dispose();
+//            return converted;
+//        }
+//        return image;
+//    }
+//
+//    /**
+//     * 使用默认设置写入图像
+//     */
+//    private static void writeImageWithDefaultSettings(BufferedImage image, ByteArrayOutputStream baos, String formatName) throws IOException {
+//        Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(formatName.toLowerCase());
+//        if (!writers.hasNext()) {
+//            writers = ImageIO.getImageWritersByFormatName("jpeg");
+//        }
+//
+//        if (!writers.hasNext()) {
+//            throw new IOException("找不到JPEG图像写入器");
+//        }
+//
+//        ImageWriter writer = writers.next();
+//        ImageWriteParam param = writer.getDefaultWriteParam();
+//
+//        try (ImageOutputStream ios = ImageIO.createImageOutputStream(baos)) {
+//            writer.setOutput(ios);
+//            writer.write(null, new IIOImage(image, null, null), param);
+//        } finally {
+//            writer.dispose();
+//        }
+//    }
+
     /**
      * 设置图片的定位、大小和合并单元格处理
      *