From 0005d49a697ce934c6fc2a61ecb75d881b9a76f2 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 23 四月 2026 11:48:31 +0800
Subject: [PATCH] feat(production): 完善生产订单管理功能

---
 src/main/java/com/ruoyi/common/utils/MinioUtils.java |   56 ++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 50 insertions(+), 6 deletions(-)

diff --git a/src/main/java/com/ruoyi/common/utils/MinioUtils.java b/src/main/java/com/ruoyi/common/utils/MinioUtils.java
index 30e479a..19f0dcd 100644
--- a/src/main/java/com/ruoyi/common/utils/MinioUtils.java
+++ b/src/main/java/com/ruoyi/common/utils/MinioUtils.java
@@ -11,15 +11,15 @@
 import io.minio.http.Method;
 import io.minio.messages.DeleteError;
 import io.minio.messages.DeleteObject;
+import jakarta.servlet.ServletOutputStream;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.Getter;
-import org.springframework.beans.factory.annotation.Autowired;
+import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import org.springframework.util.FastByteArrayOutputStream;
 import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
@@ -29,10 +29,10 @@
 import java.util.stream.Collectors;
 
 @Component
+@RequiredArgsConstructor
 public class MinioUtils {
 
-    @Autowired
-    private MinioClient minioClient;
+    private final MinioClient minioClient;
 
     @Value("${minio.preview-expiry}")
     private Integer previewExpiry;
@@ -361,7 +361,7 @@
                     .build());
 
             // 姝g‘缂栫爜鏂囦欢鍚嶏細鏇挎崲 + 涓� %20
-            String encodedFileName = URLEncoder.encode(originalFileName, StandardCharsets.UTF_8)
+            String encodedFileName = URLEncoder.encode(originalFileName, String.valueOf(StandardCharsets.UTF_8))
                     .replace("+", "%20");
 
             Map<String, String> reqParams = new HashMap<>();
@@ -386,4 +386,48 @@
             throw new UtilException("鐢熸垚涓嬭浇URL澶辫触: " + e.getMessage(), e);
         }
     }
+
+    public String getDownloadUrl(String bucketFileName, String bucketName) {
+        if (StringUtils.isNotBlank(bucketFileName)) {
+            try {
+                // 妫�鏌ユ枃浠舵槸鍚﹀瓨鍦�
+                minioClient.statObject(StatObjectArgs.builder()
+                        .bucket(bucketName)
+                        .object(bucketFileName)
+                        .build());
+
+                // 璁剧疆鍝嶅簲澶�
+                Map<String, String> reqParams = new HashMap<>();
+                // 鎻愬彇鍘熷鏂囦欢鍚嶏紙濡傛灉瀛樺偍鏃朵繚鐣欎簡鍘熷鍚嶇О锛�
+                String originalFileName = extractOriginalFileName(bucketFileName);
+                reqParams.put("response-content-disposition",
+                        "attachment; filename=\"" + URLEncoder.encode(originalFileName, String.valueOf(StandardCharsets.UTF_8)) + "\"");
+
+                // 鏋勫缓棰勭鍚峌RL鍙傛暟
+                GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
+                        .method(Method.GET)
+                        .bucket(bucketName)
+                        .object(bucketFileName)
+                        .expiry(previewExpiry, TimeUnit.HOURS)
+                        .extraQueryParams(reqParams)
+                        .build();
+
+                return minioClient.getPresignedObjectUrl(args);
+            } catch (Exception e) {
+                throw new UtilException("MinioUtils锛氱敓鎴愪笅杞介摼鎺ュ紓甯�", e);
+            }
+        }
+        return null;
+    }
+
+    private String extractOriginalFileName(String bucketFileName) {
+        // 绀轰緥锛氬鏋滃瓨鍌ㄦ牸寮忎负 "鍘熷鏂囦欢鍚峗UUID"
+        int underscoreIndex = bucketFileName.lastIndexOf("_");
+        if (underscoreIndex > 0) {
+            return bucketFileName.substring(0, underscoreIndex);
+        }
+        // 濡傛灉娌℃湁鐗规畩鏍煎紡锛岀洿鎺ヨ繑鍥炲畬鏁存枃浠跺悕
+        return bucketFileName;
+    }
+
 }

--
Gitblit v1.9.3