From a7cf1913c376b53f487f0ef8dfff084c5bc010a7 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 17 十月 2026 11:19:12 +0800
Subject: [PATCH] feat(mes): 支持二维码导出任务的分段下载功能

---
 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java |   44 +++++++++++++++++++++++++++++++++++++-------
 1 files changed, 37 insertions(+), 7 deletions(-)

diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java
index c35c287..9a30eb5 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/framework/qrcode/QrCodeImageUtils.java
@@ -9,6 +9,9 @@
 import lombok.extern.slf4j.Slf4j;
 
 import javax.imageio.ImageIO;
+import javax.imageio.ImageWriter;
+import javax.imageio.stream.ImageOutputStream;
+import javax.imageio.stream.MemoryCacheImageOutputStream;
 import java.awt.Color;
 import java.awt.Font;
 import java.awt.FontMetrics;
@@ -17,6 +20,7 @@
 import java.awt.RenderingHints;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
+import java.io.FilterOutputStream;
 import java.util.List;
 import java.util.Set;
 import java.util.zip.ZipEntry;
@@ -32,9 +36,6 @@
 
     private QrCodeImageUtils() {
     }
-
-    /** 鎵归噺瀵煎嚭浜岀淮鐮佹暟閲忎笂闄愶紙闃叉涓�娆℃�х敓鎴愯繃澶氬鑷村唴瀛�/鍝嶅簲杩囧ぇ锛� */
-    public static final int MAX_QR_EXPORT = 2000;
 
     /** 浜岀淮鐮佽竟闀� */
     private static final int QR_SIZE = 260;
@@ -120,10 +121,7 @@
         ZipOutputStream zip = new ZipOutputStream(response.getOutputStream());
         try {
             for (QrLabelInfo label : labels) {
-                BufferedImage image = createQrLabel(label.getCode(), label.getFileName());
-                zip.putNextEntry(new ZipEntry(label.getFileName() + ".png"));
-                ImageIO.write(image, "png", zip);
-                zip.closeEntry();
+                writeZipEntry(zip, label);
             }
             zip.finish();
             zip.flush();
@@ -132,6 +130,38 @@
         }
     }
 
+    /**
+     * 鐢熸垚鍗曞紶鏍囩骞跺啓鍏� ZIP 鏉$洰
+     * <p>
+     * 渚涘悗鍙板鍑轰换鍔¤嚜寤哄啓鍏ュ惊鐜椂澶嶇敤锛氳皟鐢ㄦ柟闇�瑕佽嚜琛屽湪姣忓紶涔嬮棿妫�鏌ュ彇娑堛�侀噰鏍� CPU 骞跺洖鍐欒繘搴︼紝
+     * 鍥犳杩欓噷鍙礋璐�"涓�寮�"鐨勫鐞嗭紝涓嶆帴绠″惊鐜��
+     *
+     * @param zip   ZIP 杈撳嚭娴�
+     * @param label 鏍囩淇℃伅
+     */
+    public static void writeZipEntry(ZipOutputStream zip, QrLabelInfo label) throws IOException {
+        BufferedImage image = createQrLabel(label.getCode(), label.getFileName());
+        zip.putNextEntry(new ZipEntry(label.getFileName() + ".png"));
+        try {
+            // ImageIO.write(OutputStream) 鍙兘涓烘瘡寮犲浘鐗囧垱寤虹鐩樼紦瀛橈紱澶ф壒閲忓鍑烘敼鐢ㄥ唴瀛樼紦瀛樸��
+            // 鍖呰娴佺殑 close 浠� flush锛屼笉鑳藉叧闂灞� ZIP銆�
+            ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next();
+            try (ImageOutputStream imageOut = new MemoryCacheImageOutputStream(new FilterOutputStream(zip) {
+                @Override
+                public void close() throws IOException {
+                    flush();
+                }
+            })) {
+                writer.setOutput(imageOut);
+                writer.write(image);
+            } finally {
+                writer.dispose();
+            }
+        } finally {
+            zip.closeEntry();
+        }
+    }
+
     // ==================== 绉佹湁鏂规硶 ====================
 
     /**

--
Gitblit v1.9.3