From a816065c4c3bdbd353f5ad3020bb2848c6c55af0 Mon Sep 17 00:00:00 2001
From: liuxm <liuxm@fescotech.com>
Date: 星期二, 21 五月 2024 09:01:55 +0800
Subject: [PATCH] 抽取方法:生成二维码;下载excel文件

---
 pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/util/QrCodeUtil.java           |   63 +++++++++++++++++++++++++++++++
 pms-parent/pms-web-base/src/main/java/com/dy/pmsBase/MarkQrCode/MarkQrCodeCtrl.java |   38 +++----------------
 2 files changed, 69 insertions(+), 32 deletions(-)

diff --git a/pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/util/QrCodeUtil.java b/pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/util/QrCodeUtil.java
new file mode 100644
index 0000000..93b5da3
--- /dev/null
+++ b/pms-parent/pms-global/src/main/java/com/dy/pmsGlobal/util/QrCodeUtil.java
@@ -0,0 +1,63 @@
+package com.dy.pmsGlobal.util;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.converters.Converter;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.dy.common.util.QrCodeGenerator;
+import com.google.zxing.WriterException;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.io.ClassPathResource;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+@Slf4j
+public class QrCodeUtil {
+    private static final ConcurrentHashMap<String, File> logoCache = new ConcurrentHashMap<>();
+    private static final String LOGO_PATH = "/images/logo.png";
+
+
+    /**
+     * 鐢熸垚甯ogo鐨勪簩缁寸爜鍥剧墖瀛楄妭鏁扮粍銆�
+     * @param code 浜岀淮鐮佸唴瀹�
+     * @return 浜岀淮鐮佸浘鐗囩殑瀛楄妭鏁扮粍
+     * @throws IOException IO寮傚父
+     * @throws WriterException 浜岀淮鐮佺敓鎴愬紓甯�
+     */
+    public static byte[] genQrCode(String code) throws IOException, WriterException {
+        File logoFile = logoCache.computeIfAbsent(LOGO_PATH, key -> {
+            try {
+                ClassPathResource resource = new ClassPathResource(key);
+                return resource.getFile();
+            } catch (IOException e) {
+                throw new RuntimeException("鍔犺浇Logo鍥剧墖澶辫触", e);
+            }
+        });
+
+        BufferedImage qrCodeImage = QrCodeGenerator.toBufferedImage(QrCodeGenerator.createBitMatrix(code, QrCodeConstant.MarkQrCodeWidth, QrCodeConstant.MarkQrCodeHeight));
+        if (logoFile != null) {
+            qrCodeImage = QrCodeGenerator.addQrCodeLogo(qrCodeImage, logoFile);
+        }
+        return QrCodeGenerator.bufferedImageToByteArray(qrCodeImage, "JPEG");
+    }
+
+    public static void downloadExcel(HttpServletResponse response, String fileName, String sheetName, List<Converter> list){
+        if(CollectionUtils.isEmpty(list)){
+            return;
+        }
+        try{
+            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+            response.setCharacterEncoding("utf-8");
+            fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
+            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+            EasyExcel.write(response.getOutputStream(), list.get(0).getClass()).sheet(sheetName).doWrite(list);
+            EasyExcel.write(response.getOutputStream(), Converter.class).sheet(sheetName).doWrite(list);
+        }catch (Exception e){
+            log.error("瀵煎嚭浜у搧淇℃伅寮傚父", e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/pms-parent/pms-web-base/src/main/java/com/dy/pmsBase/MarkQrCode/MarkQrCodeCtrl.java b/pms-parent/pms-web-base/src/main/java/com/dy/pmsBase/MarkQrCode/MarkQrCodeCtrl.java
index ddbd240..e9655a4 100644
--- a/pms-parent/pms-web-base/src/main/java/com/dy/pmsBase/MarkQrCode/MarkQrCodeCtrl.java
+++ b/pms-parent/pms-web-base/src/main/java/com/dy/pmsBase/MarkQrCode/MarkQrCodeCtrl.java
@@ -2,22 +2,17 @@
 
 
 import cn.hutool.core.codec.Base64;
-import com.alibaba.excel.EasyExcel;
-import com.dy.common.util.QrCodeGenerator;
+import com.alibaba.excel.converters.Converter;
 import com.dy.common.webUtil.BaseResponse;
 import com.dy.common.webUtil.BaseResponseUtils;
 import com.dy.pmsGlobal.util.QrCodeConstant;
+import com.dy.pmsGlobal.util.QrCodeUtil;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.core.io.ClassPathResource;
-import org.springframework.core.io.Resource;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.awt.image.BufferedImage;
-import java.io.File;
-import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -41,20 +36,12 @@
     public BaseResponse<List<ResultVo>> show() {
         try{
             List<ResultVo> list = new ArrayList<>() ;
-            Resource resource = new ClassPathResource("/images/logo.png");
-            File logoPngFile = resource.getFile() ;
             String[][] marks = QrCodeConstant.Marks() ;
             for(String[] mark : marks){
                 ResultVo vo = new ResultVo() ;
                 vo.code = mark[0] ;
                 vo.name = mark[1] ;
-                //vo.code = "1234567890123456789012" ;
-                //BufferedImage bufferedImage = QrCodeGenerator.toBufferedImage(QrCodeGenerator.createBitMatrix(vo.code, 30, 30));
-                BufferedImage bufferedImage = QrCodeGenerator.toBufferedImage(QrCodeGenerator.createBitMatrix(vo.code, QrCodeConstant.MarkQrCodeWidth, QrCodeConstant.MarkQrCodeHeight));
-                if(logoPngFile != null && logoPngFile.exists()){
-                    bufferedImage = QrCodeGenerator.addQrCodeLogo(bufferedImage, logoPngFile);
-                }
-                byte[] codes = QrCodeGenerator.bufferedImageToByteArray(bufferedImage, "JPG");
+                byte[] codes = QrCodeUtil.genQrCode(vo.code);
                 vo.imgBase64 = "data:image/jpeg;base64," + Base64.encode(codes);
                 list.add(vo) ;
             }
@@ -72,29 +59,16 @@
     @GetMapping(path = "download")
     public void download(HttpServletResponse response){
         try{
-            // 杩欓噷娉ㄦ剰 鏈夊悓瀛﹀弽搴斾娇鐢╯wagger 浼氬鑷村悇绉嶉棶棰橈紝璇风洿鎺ョ敤娴忚鍣ㄦ垨鑰呯敤postman
-            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
-            response.setCharacterEncoding("utf-8");
-            // 杩欓噷URLEncoder.encode鍙互闃叉涓枃涔辩爜 褰撶劧鍜宔asyexcel娌℃湁鍏崇郴
-            String fileName = URLEncoder.encode(MarkQrCodeCtrl.fileName, "UTF-8").replaceAll("\\+", "%20");
-            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
-
-            List<ExcelVo> list = new ArrayList<>() ;
-            Resource resource = new ClassPathResource("/images/logo.png");
-            File logoPngFile = resource.getFile() ;
+            List<Converter> list = new ArrayList<>() ;
             String[][] marks = QrCodeConstant.Marks() ;
             for(String[] mark : marks){
                 ExcelVo vo = new ExcelVo() ;
                 vo.code = mark[0] ;
                 vo.name = mark[1] ;
-                BufferedImage bufferedImage = QrCodeGenerator.toBufferedImage(QrCodeGenerator.createBitMatrix(vo.code, QrCodeConstant.MarkQrCodeWidth, QrCodeConstant.MarkQrCodeHeight));
-                if(logoPngFile != null && logoPngFile.exists()){
-                    bufferedImage = QrCodeGenerator.addQrCodeLogo(bufferedImage, logoPngFile);
-                }
-                vo.image = QrCodeGenerator.bufferedImageToByteArray(bufferedImage, "JPG");
+                vo.image = QrCodeUtil.genQrCode(vo.code);
                 list.add(vo) ;
             }
-            EasyExcel.write(response.getOutputStream(), ExcelVo.class).sheet(MarkQrCodeCtrl.sheetName).doWrite(list);
+            QrCodeUtil.downloadExcel(response, fileName, sheetName, list);
         }catch (Exception e){
             log.error("涓嬭浇鏍囪瘑绫讳簩缁寸爜鏃跺紓甯�", e);
         }

--
Gitblit v1.8.0