From c93fc713fedb68cc96f6f29e0442d949b44b7caa Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期四, 30 四月 2026 17:37:16 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New_pro' into dev_New_pro

---
 src/main/java/com/ruoyi/basic/utils/FileUtil.java |  120 +++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 83 insertions(+), 37 deletions(-)

diff --git a/src/main/java/com/ruoyi/basic/utils/FileUtil.java b/src/main/java/com/ruoyi/basic/utils/FileUtil.java
index 6f1d5cf..c57468a 100644
--- a/src/main/java/com/ruoyi/basic/utils/FileUtil.java
+++ b/src/main/java/com/ruoyi/basic/utils/FileUtil.java
@@ -286,41 +286,20 @@
     /**
      * 閫氳繃璁板綍绫诲瀷鑾峰彇鏂囦欢淇℃伅 attachment锛堝垎椤碉級
      *
-     * @param page       鍒嗛〉鍙傛暟
      * @param storageAttachmentDTO 鍏宠仈璁板綍淇℃伅
      */
-    public IPage<StorageAttachmentVO> getStorageAttachmentVosPageListByApplicationAndRecordTypeAndRecordId(Page page, StorageAttachmentDTO storageAttachmentDTO) {
-        // 鍒嗛〉鏌ヨ绗﹀悎鏉′欢鐨� StorageAttachment 璁板綍
+    public List<StorageBlobVO> getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(StorageAttachmentDTO storageAttachmentDTO) {
         LambdaQueryWrapper<StorageAttachment> queryWrapper = new LambdaQueryWrapper<StorageAttachment>()
                 .eq(StorageAttachment::getRecordType, storageAttachmentDTO.getRecordType())
                 .eq(StorageAttachment::getRecordId, storageAttachmentDTO.getRecordId());
         if (storageAttachmentDTO.getApplication() != null) {
             queryWrapper.eq(StorageAttachment::getApplication, storageAttachmentDTO.getApplication());
         }
-        IPage<StorageAttachmentVO> storageAttachmentIPage = storageAttachmentMapper.selectPage(page, queryWrapper);
-
-        // 杞崲涓� StorageAttachmentVO 骞惰幏鍙栧搴旂殑 StorageBlobVO
-        List<StorageAttachmentVO> storageAttachmentVOS = new ArrayList<>();
-        if (CollectionUtils.isNotEmpty(storageAttachmentIPage.getRecords())) {
-            for (StorageAttachment storageAttachment : storageAttachmentIPage.getRecords()) {
-                StorageAttachmentVO storageAttachmentVO = new StorageAttachmentVO();
-                BeanUtils.copyProperties(storageAttachment, storageAttachmentVO);
-                List<StorageBlobVO> storageBlobVOS = getStorageBlobVOsByStorageAttachmentIds(Collections.singletonList(storageAttachment.getId()));
-                if (CollectionUtils.isEmpty(storageBlobVOS)) {
-                    storageAttachmentVO.setStorageBlobVOS(new ArrayList<>());
-                } else {
-                    storageAttachmentVO.setStorageBlobVOS(storageBlobVOS);
-                }
-                storageAttachmentVOS.add(storageAttachmentVO);
-            }
+        List<StorageAttachment> storageAttachments = storageAttachmentMapper.selectList(queryWrapper);
+        if (CollectionUtils.isEmpty(storageAttachments)) {
+            return null;
         }
-
-        // 鏋勫缓鍒嗛〉缁撴灉
-        IPage<StorageAttachmentVO> resultPage = new Page<>();
-        BeanUtils.copyProperties(storageAttachmentIPage, resultPage);
-        resultPage.setRecords(storageAttachmentVOS);
-
-        return resultPage;
+        return getStorageBlobVOsByStorageAttachmentIds(storageAttachments.stream().map(StorageAttachment::getId).collect(Collectors.toList()));
     }
 
     /**
@@ -355,6 +334,9 @@
         if (CollectionUtils.isEmpty(storageAttachments)) {
             return null;
         }
+        Map<Long, Long> blobIdToAttachmentIdMap = storageAttachments.stream()
+                .collect(Collectors.toMap(StorageAttachment::getStorageBlobId, StorageAttachment::getId));
+
         List<Long> storageBlobIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId).collect(Collectors.toList());
         List<StorageBlob> storageBlobs = storageBlobMapper.selectByIds(storageBlobIds);
         List<StorageBlobVO> storageBlobDTOS = new ArrayList<>();
@@ -363,9 +345,28 @@
             BeanUtils.copyProperties(storageBlob, storageBlobVO);
             storageBlobVO.setPreviewURL(buildSignedPreviewUrl(storageBlobVO));
             storageBlobVO.setDownloadURL(buildSignedDownloadUrl(storageBlobVO));
+            storageBlobVO.setStorageAttachmentId(blobIdToAttachmentIdMap.get(storageBlob.getId()));
             storageBlobDTOS.add(storageBlobVO);
         }
         return storageBlobDTOS;
+    }
+
+    /**
+     * 閫氳繃鏂囦欢鐢ㄩ�斻�佸叧鑱旇褰曠被鍨嬨�佸叧鑱旇褰昳d鑾峰彇鏂囦欢鍏宠仈淇℃伅 attachment
+     *
+     * @param recordType  鍏宠仈璁板綍绫诲瀷
+     * @param recordId    鍏宠仈璁板綍id
+     */
+    public List<StorageAttachment> getStorageAttachmentsByRecordTypeAndRecordId(RecordTypeEnum recordType, Long recordId) {
+        if (recordId == null || recordId <= 0) {
+            throw new RuntimeException("鍏宠仈璁板綍id涓嶈兘涓虹┖");
+        }
+        if (recordType == null) {
+            throw new RuntimeException("鍏宠仈璁板綍绫诲瀷涓嶈兘涓虹┖");
+        }
+        return storageAttachmentMapper.selectList(new LambdaQueryWrapper<StorageAttachment>()
+                .eq(StorageAttachment::getRecordType, recordType.getType())
+                .eq(StorageAttachment::getRecordId, recordId));
     }
 
     /**
@@ -377,6 +378,35 @@
      */
     public List<StorageBlobVO> getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum application, RecordTypeEnum recordType, Long recordId) {
         List<StorageAttachment> storageAttachments = getStorageAttachmentsByApplicationAndRecordTypeAndRecordId(application, recordType, recordId);
+        if (CollectionUtils.isEmpty(storageAttachments)) {
+            return null;
+        }
+        // 鏋勫缓 storageBlobId -> storageAttachmentId 鐨勬槧灏�
+        Map<Long, Long> blobIdToAttachmentIdMap = storageAttachments.stream()
+                .collect(Collectors.toMap(StorageAttachment::getStorageBlobId, StorageAttachment::getId));
+
+        List<Long> storageBlobIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId).collect(Collectors.toList());
+        List<StorageBlob> storageBlobs = storageBlobMapper.selectByIds(storageBlobIds);
+        List<StorageBlobVO> storageBlobDTOS = new ArrayList<>();
+        for (StorageBlob storageBlob : storageBlobs) {
+            StorageBlobVO storageBlobVO = new StorageBlobVO();
+            BeanUtils.copyProperties(storageBlob, storageBlobVO);
+            storageBlobVO.setPreviewURL(buildSignedPreviewUrl(storageBlobVO));
+            storageBlobVO.setDownloadURL(buildSignedDownloadUrl(storageBlobVO));
+            storageBlobVO.setStorageAttachmentId(blobIdToAttachmentIdMap.get(storageBlob.getId()));
+            storageBlobDTOS.add(storageBlobVO);
+        }
+        return storageBlobDTOS;
+    }
+
+    /**
+     * 閫氳繃鏂囦欢鐢ㄩ�斻�佸叧鑱旇褰曠被鍨嬨�佸叧鑱旇褰昳d鑾峰彇鏂囦欢淇℃伅 blob
+     *
+     * @param recordType  鍏宠仈璁板綍绫诲瀷
+     * @param recordId    鍏宠仈璁板綍id
+     */
+    public List<StorageBlobVO> getStorageBlobVOsByRecordTypeAndRecordId(RecordTypeEnum recordType, Long recordId) {
+        List<StorageAttachment> storageAttachments = getStorageAttachmentsByRecordTypeAndRecordId(recordType, recordId);
         if (CollectionUtils.isEmpty(storageAttachments)) {
             return null;
         }
@@ -406,6 +436,10 @@
         if (CollectionUtils.isEmpty(storageAttachments)) {
             return null;
         }
+        // 鏋勫缓 storageBlobId -> storageAttachmentId 鐨勬槧灏�
+        Map<Long, Long> blobIdToAttachmentIdMap = storageAttachments.stream()
+                .collect(Collectors.toMap(StorageAttachment::getStorageBlobId, StorageAttachment::getId));
+
         List<Long> storageBlobIds = storageAttachments.stream().map(StorageAttachment::getStorageBlobId).collect(Collectors.toList());
         List<StorageBlob> storageBlobs = storageBlobMapper.selectByIds(storageBlobIds);
         List<StorageBlobVO> storageBlobDTOS = new ArrayList<>();
@@ -414,6 +448,7 @@
             BeanUtils.copyProperties(storageBlob, storageBlobVO);
             storageBlobVO.setPreviewURL(buildSignedUrl(storageBlobVO, "/preview/", expired));
             storageBlobVO.setDownloadURL(buildSignedUrl(storageBlobVO, "/download/", expired));
+            storageBlobVO.setStorageAttachmentId(blobIdToAttachmentIdMap.get(storageBlob.getId()));
             storageBlobDTOS.add(storageBlobVO);
         }
         return storageBlobDTOS;
@@ -691,8 +726,28 @@
         if (storageBlob == null || !StringUtils.hasText(storageBlob.getUidFilename())) {
             throw new IllegalArgumentException("鏂囦欢淇℃伅涓嶅畬鏁�");
         }
+        String domain = StringUtils.trimTrailingCharacter(properties.getDomain(), '/');
+        String prefix = properties.getUrlPrefix().startsWith("/") ? properties.getUrlPrefix() : "/" + properties.getUrlPrefix();
+        String normalizedActionPath = StringUtils.hasText(actionPath) ? actionPath : "/preview/";
+        if (!normalizedActionPath.startsWith("/")) {
+            normalizedActionPath = "/" + normalizedActionPath;
+        }
+        if (!normalizedActionPath.endsWith("/")) {
+            normalizedActionPath = normalizedActionPath + "/";
+        }
+        String baseUrl = domain + prefix + normalizedActionPath + storageBlob.getUidFilename();
+
+        // -1 琛ㄧず姘镐箙鏈夋晥锛屼笉鐢熸垚 token锛屾敼涓� publicKey 缁勫悎鏍¢獙
+        if (expired != null && BigDecimal.valueOf(-1L).compareTo(expired) == 0) {
+            if (!StringUtils.hasText(storageBlob.getResourceKey())) {
+                throw new IllegalArgumentException("鍏紑閾炬帴缂哄皯publicKey");
+            }
+            return baseUrl + "?publicKey=" + storageBlob.getResourceKey();
+        }
+
         long now = System.currentTimeMillis();
-        long expiredMillis = expired.multiply(new BigDecimal("60000")).longValue();
+        BigDecimal expiredValue = expired == null ? new BigDecimal("120") : expired;
+        long expiredMillis = expiredValue.multiply(new BigDecimal("60000")).longValue();
         if (expiredMillis <= 0L) {
             expiredMillis = 2L * 60L * 60L * 1000L;
         }
@@ -709,16 +764,7 @@
                 .signWith(key)            // 閲嶇偣锛氫紶鍏ヤ笂闈㈢敓鎴愮殑 key 瀵硅薄锛岃�屼笉鏄� String
                 .compact();
         cacheTokenUsage(token, expiredMillis);
-        String domain = StringUtils.trimTrailingCharacter(properties.getDomain(), '/');
-        String prefix = properties.getUrlPrefix().startsWith("/") ? properties.getUrlPrefix() : "/" + properties.getUrlPrefix();
-        String normalizedActionPath = StringUtils.hasText(actionPath) ? actionPath : "/preview/";
-        if (!normalizedActionPath.startsWith("/")) {
-            normalizedActionPath = "/" + normalizedActionPath;
-        }
-        if (!normalizedActionPath.endsWith("/")) {
-            normalizedActionPath = normalizedActionPath + "/";
-        }
-        return domain + prefix + normalizedActionPath + storageBlob.getUidFilename() + "?token=" + token;
+        return baseUrl + "?token=" + token;
     }
 
     private void cacheTokenUsage(String token, long expiredMillis) {

--
Gitblit v1.9.3