Selaa lähdekoodia

新增 删除单个分镜

tsurumure 1 kuukausi sitten
vanhempi
commit
7dc96d44e4
17 muutettua tiedostoa jossa 245 lisäystä ja 44 poistoa
  1. 1 1
      src/main/java/com/backendsys/modules/app/user/service/impl/AppAuthServiceImpl.java
  2. 16 12
      src/main/java/com/backendsys/modules/crt/controller/CrtDramaProjectStoryboardController.java
  3. 2 1
      src/main/java/com/backendsys/modules/crt/entity/CrtDramaProjectStoryboard.java
  4. 5 1
      src/main/java/com/backendsys/modules/crt/service/CrtDramaProjectStoryboardService.java
  5. 56 7
      src/main/java/com/backendsys/modules/crt/service/impl/CrtDramaProjectStoryboardServiceImpl.java
  6. 3 3
      src/main/java/com/backendsys/modules/crt/service/impl/CrtGenerateServiceImpl.java
  7. 1 1
      src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiSocketServiceImpl.java
  8. 2 2
      src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiText2ImageServiceImpl.java
  9. 2 2
      src/main/java/com/backendsys/modules/sdk/comfyui/utils/ComfyUtil.java
  10. 3 2
      src/main/java/com/backendsys/modules/sdk/douyincloud/tos/service/DouyinTosService.java
  11. 48 0
      src/main/java/com/backendsys/modules/sdk/douyincloud/tos/service/impl/DouyinTosServiceImpl.java
  12. 2 2
      src/main/java/com/backendsys/modules/sdk/tencentcloud/cos/service/TencentCosService.java
  13. 31 5
      src/main/java/com/backendsys/modules/sdk/tencentcloud/cos/service/impl/TencentCosServiceImpl.java
  14. 11 0
      src/main/java/com/backendsys/modules/upload/entity/ObjectKey.java
  15. 1 5
      src/main/java/com/backendsys/modules/upload/service/impl/SysFileServiceImpl.java
  16. 59 0
      src/main/java/com/backendsys/modules/upload/utils/ObjectKeyUtil.java
  17. 2 0
      src/main/java/com/backendsys/modules/upload/utils/UploadUtil.java

+ 1 - 1
src/main/java/com/backendsys/modules/app/user/service/impl/AppAuthServiceImpl.java

@@ -155,7 +155,7 @@ public class AppAuthServiceImpl implements AppAuthService {
 //                .toString("yyyy-MM-dd HH:mm:ss");
 //        appUser.setLast_login_time(utcTimeStr);
 
-        // [db] 更新前台用户信息
+        // [DB] 更新前台用户信息
         appUserDao.updateById(appUser);
 
 

+ 16 - 12
src/main/java/com/backendsys/modules/crt/controller/CrtDramaProjectStoryboardController.java

@@ -23,7 +23,6 @@ public class CrtDramaProjectStoryboardController {
     @Autowired
     private CrtDramaProjectStoryboardService crtDramaProjectStoryboardService;
 
-
     @Operation(summary = "获取分集信息/分镜列表")
     @PreAuthorize("@sr.hasPermission('36.2.1')")
     @GetMapping("/api/crt/drama/getStoryboard")
@@ -40,15 +39,6 @@ public class CrtDramaProjectStoryboardController {
         return Result.success().put("data", crtDramaProjectStoryboardService.createStoryboard(crtDramaProjectStoryboard));
     }
 
-    @SysLog("删除分集")
-    @Operation(summary = "删除分集")
-    @DeleteMapping("/api/crt/drama/deleteStoryboard")
-    public Result deleteStoryboard(@Validated(CrtDramaProjectStoryboard.Delete.class) @RequestBody CrtDramaProjectStoryboard crtDramaProjectStoryboard) {
-        return Result.success().put("data", crtDramaProjectStoryboardService.deleteStoryboard(crtDramaProjectStoryboard));
-    }
-
-
-
     @SysLog("编辑分镜")
     @Operation(summary = "编辑分镜")
     @PutMapping("/api/crt/drama/updateStoryboard")
@@ -56,11 +46,25 @@ public class CrtDramaProjectStoryboardController {
         return Result.success().put("data", crtDramaProjectStoryboardService.updateStoryboard(crtDramaProjectStoryboard));
     }
 
-    @SysLog("清除分镜")
-    @Operation(summary = "清除分镜")
+    @SysLog("清空全部分镜 (仅保留一个空分镜)")
+    @Operation(summary = "清空全部分镜 (仅保留一个空分镜)")
     @DeleteMapping("/api/crt/drama/clearStoryboard")
     public Result clearStoryboard(@Validated(CrtDramaProjectStoryboard.Clear.class) @RequestBody CrtDramaProjectStoryboard crtDramaProjectStoryboard) {
         return Result.success().put("data", crtDramaProjectStoryboardService.clearStoryboard(crtDramaProjectStoryboard));
     }
 
+    @SysLog("删除分集")
+    @Operation(summary = "删除分集")
+    @DeleteMapping("/api/crt/drama/deleteStoryboard")
+    public Result deleteStoryboard(@Validated(CrtDramaProjectStoryboard.Delete.class) @RequestBody CrtDramaProjectStoryboard crtDramaProjectStoryboard) {
+        return Result.success().put("data", crtDramaProjectStoryboardService.deleteStoryboard(crtDramaProjectStoryboard));
+    }
+
+    @SysLog("删除单个分镜")
+    @Operation(summary = "删除单个分镜")
+    @DeleteMapping("/api/crt/drama/deleteStoryboardBySort")
+    public Result deleteStoryboardBySort(@Validated(CrtDramaProjectStoryboard.DeleteBySort.class) @RequestBody CrtDramaProjectStoryboard crtDramaProjectStoryboard) {
+        return Result.success().put("data", crtDramaProjectStoryboardService.deleteStoryboardBySort(crtDramaProjectStoryboard));
+    }
+
 }

+ 2 - 1
src/main/java/com/backendsys/modules/crt/entity/CrtDramaProjectStoryboard.java

@@ -29,6 +29,7 @@ public class CrtDramaProjectStoryboard {
     public static interface Update{}
     public static interface Clear{}
     public static interface Delete{}
+    public static interface DeleteBySort{}
     public static interface GenerateImage{}
     public static interface GenerateImageList{}
 
@@ -36,7 +37,7 @@ public class CrtDramaProjectStoryboard {
     private Long id;
 
     @TableField("id")
-    @NotNull(message = "分镜ID不能为空", groups = { Update.class, GenerateImage.class, GenerateImageList.class })
+    @NotNull(message = "分镜ID不能为空", groups = { Update.class, GenerateImage.class, GenerateImageList.class, DeleteBySort.class })
     private Long drama_project_storyboard_id;
 
     private Long user_id;

+ 5 - 1
src/main/java/com/backendsys/modules/crt/service/CrtDramaProjectStoryboardService.java

@@ -19,9 +19,13 @@ public interface CrtDramaProjectStoryboardService {
     // 编辑分镜
     Map<String, Object> updateStoryboard(CrtDramaProjectStoryboard crtDramaProjectStoryboard);
 
-    // 清空分镜
+    // 清空全部分镜 (仅保留一个空分镜)
     Map<String, Object> clearStoryboard(CrtDramaProjectStoryboard crtDramaProjectStoryboard);
 
     // 删除分集
     Map<String, Object> deleteStoryboard(CrtDramaProjectStoryboard crtDramaProjectStoryboard);
+
+    // 删除单个分镜
+    Map<String, Object> deleteStoryboardBySort(CrtDramaProjectStoryboard crtDramaProjectStoryboard);
+
 }

+ 56 - 7
src/main/java/com/backendsys/modules/crt/service/impl/CrtDramaProjectStoryboardServiceImpl.java

@@ -8,29 +8,34 @@ import com.backendsys.modules.common.enums.MatchType;
 import com.backendsys.modules.crt.dao.CrtDramaProjectDao;
 import com.backendsys.modules.crt.dao.CrtDramaProjectSettingsDao;
 import com.backendsys.modules.crt.dao.CrtDramaProjectStoryboardDao;
+import com.backendsys.modules.crt.dao.CrtGenerateImageDao;
 import com.backendsys.modules.crt.entity.*;
 import com.backendsys.modules.crt.service.CrtDramaProjectStoryboardService;
+import com.backendsys.modules.upload.entity.ObjectKey;
 import com.backendsys.modules.upload.enums.StyleEnums;
+import com.backendsys.modules.upload.utils.ObjectKeyUtil;
 import com.backendsys.modules.upload.utils.UploadUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 @Service
 public class CrtDramaProjectStoryboardServiceImpl implements CrtDramaProjectStoryboardService {
 
+    @Autowired
+    private ObjectKeyUtil objectKeyUtil;
     @Autowired
     private SecurityUtil securityUtil;
     @Autowired
     private CrtDramaProjectDao crtDramaProjectDao;
     @Autowired
+    private CrtGenerateImageDao crtGenerateImageDao;
+    @Autowired
     private CrtDramaProjectSettingsDao crtDramaProjectSettingsDao;
     @Autowired
     private CrtDramaProjectStoryboardDao crtDramaProjectStoryboardDao;
@@ -47,12 +52,12 @@ public class CrtDramaProjectStoryboardServiceImpl implements CrtDramaProjectStor
         if (crtDramaProject == null) throw new CustException("项目不存在");
 
         List<CrtDramaProjectStoryboard> storyboardList = crtDramaProjectStoryboardDao.selectStoryboardList(crtDramaProjectStoryboard);
-        if (storyboardList.isEmpty()) throw new CustException("分镜不存在");
+        if (storyboardList != null && storyboardList.isEmpty()) throw new CustException("分镜不存在");
 
         // 获取分镜列表
         storyboardList.stream().forEach(storyboard -> {
             // 获取分镜生图结果
-            if (!storyboard.getGenerate_images().isEmpty()) {
+            if (storyboard.getGenerate_images() != null && !storyboard.getGenerate_images().isEmpty()) {
                 // 设置生图结果缩略略
                 List<CrtGenerateImage> generate_image_list = storyboard.getGenerate_images().stream().map(item -> {
                     String url = item.getUrl();
@@ -187,7 +192,7 @@ public class CrtDramaProjectStoryboardServiceImpl implements CrtDramaProjectStor
     }
 
     /**
-     * 清空分镜
+     * 清空全部分镜 (仅保留一个空分镜)
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -231,4 +236,48 @@ public class CrtDramaProjectStoryboardServiceImpl implements CrtDramaProjectStor
         return resp;
     }
 
+    /**
+     * 删除单个分镜
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Map<String, Object> deleteStoryboardBySort(CrtDramaProjectStoryboard crtDramaProjectStoryboard) {
+
+        Long drama_project_storyboard_id = crtDramaProjectStoryboard.getDrama_project_storyboard_id();
+
+        LambdaQueryWrapper<CrtDramaProjectStoryboard> wrapperStoryboard = new LambdaQueryWrapper<>();
+        wrapperStoryboard.eq(CrtDramaProjectStoryboard::getDrama_project_storyboard_id, drama_project_storyboard_id);
+        Boolean is_exist = crtDramaProjectStoryboardDao.exists(wrapperStoryboard);
+        if (!is_exist) throw new CustException("分镜不存在");
+
+        // [DB] 删除分镜
+        crtDramaProjectStoryboardDao.deleteById(drama_project_storyboard_id);
+
+        // 同时删除分镜下的生图内容 (批量删除 cos/tos)
+        LambdaQueryWrapper<CrtGenerateImage> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(CrtGenerateImage::getDrama_project_storyboard_id, drama_project_storyboard_id);
+        List<CrtGenerateImage> generateImageList = crtGenerateImageDao.selectList(wrapper);
+        if (generateImageList != null && !generateImageList.isEmpty()) {
+
+            // 获得生图内容的 object_keys
+            List<ObjectKey> object_keys = new ArrayList<>();
+            generateImageList.stream().forEach(item -> {
+                ObjectKey objectKey = new ObjectKey();
+                objectKey.setObject_key(item.getObject_key());
+                objectKey.setTarget(item.getTarget());
+                object_keys.add(objectKey);
+            });
+
+            CompletableFuture.runAsync(() -> {
+                // 批量删除生图记录
+                crtGenerateImageDao.delete(wrapper);
+                // 批量删除 ObjectKeys (By target)
+                objectKeyUtil.deleteObjects(object_keys);
+            });
+
+        }
+
+        return Map.of("drama_project_storyboard_id", drama_project_storyboard_id);
+    }
+
 }

+ 3 - 3
src/main/java/com/backendsys/modules/crt/service/impl/CrtGenerateServiceImpl.java

@@ -123,12 +123,12 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
         entity.setParam_seed(param_seed);
         entity.setText_to_image_prompt(prompt_text);
 
-        // [db] 更新分集详情记录 (种子值、提示词)
+        // [DB] 更新分集详情记录 (种子值、提示词)
         LambdaQueryWrapper<CrtDramaProjectStoryboard> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(CrtDramaProjectStoryboard::getId, drama_project_storyboard_id);
         crtDramaProjectStoryboardDao.update(entity, wrapper);
 
-        // [db] 获取画面比例 (从项目配置)
+        // [DB] 获取画面比例 (从项目配置)
         String aspect_ratio = settings_image.getAspect_ratio();
         AspectRatioEnums aspect_ratio_option = AspectRatioEnums.of(aspect_ratio);
         Integer width = aspect_ratio_option.getWidth();
@@ -136,7 +136,7 @@ public class CrtGenerateServiceImpl implements CrtGenerateService {
 //        Integer width = 1280;
 //        Integer height = 720;
 
-        // [db] 获取基础模型 (从项目配置)
+        // [DB] 获取基础模型 (从项目配置)
         Long model_id = settings_image.getModel_id();
         CrtModel modelDetail = crtModelDao.selectById(model_id);
         String model_name = modelDetail.getModel_name();

+ 1 - 1
src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiSocketServiceImpl.java

@@ -186,7 +186,7 @@ public class ComfyuiSocketServiceImpl implements ComfyuiSocketService {
                                     dataChildren.put("output", output);
                                     data.put("data", dataChildren);
 
-                                    // [db] 新增任务记录
+                                    // [DB] 新增任务记录
                                     comfyUtil.asyncUpdateTaskRecord(prompt_id, JSONUtil.toJsonStr(dataChildren), 1);
 
                                 }

+ 2 - 2
src/main/java/com/backendsys/modules/sdk/comfyui/service/impl/ComfyuiText2ImageServiceImpl.java

@@ -342,7 +342,7 @@ public class ComfyuiText2ImageServiceImpl implements ComfyuiText2ImageService {
         ComfyuiResponse response = cfPromptResponseMono.block();
         response.setClient_id(client_id);
 
-        // [db] 新增任务记录
+        // [DB] 新增任务记录
         comfyUtil.asyncInsertTaskRecord(response.getPrompt_id(), prompt);
 
         return response;
@@ -430,7 +430,7 @@ public class ComfyuiText2ImageServiceImpl implements ComfyuiText2ImageService {
         ComfyuiResponse response = cfPromptResponseMono.block();
         response.setClient_id(client_id);
 
-        // [db] 新增任务记录
+        // [DB] 新增任务记录
         comfyUtil.asyncInsertTaskRecord(response.getPrompt_id(), prompt);
 
         return response;

+ 2 - 2
src/main/java/com/backendsys/modules/sdk/comfyui/utils/ComfyUtil.java

@@ -21,7 +21,7 @@ public class ComfyUtil {
     public void asyncInsertTaskRecord(String prompt_id, String prompt) {
         Long user_id = SecurityUtil.getUserId();
         CompletableFuture.runAsync(() -> {
-            // [db] 新增任务记录
+            // [DB] 新增任务记录
             try {
                 System.out.println("-- 新增任务记录 --");
                 ComfyuiTask comfyuiTask = new ComfyuiTask();
@@ -39,7 +39,7 @@ public class ComfyUtil {
      */
     public void asyncUpdateTaskRecord(String prompt_id, String response, Integer status) {
         CompletableFuture.runAsync(() -> {
-            // [db] 新增任务记录
+            // [DB] 新增任务记录
             try {
                 System.out.println("-- 更新任务记录 --");
                 LambdaQueryWrapper<ComfyuiTask> wrapper = new LambdaQueryWrapper<>();

+ 3 - 2
src/main/java/com/backendsys/modules/sdk/douyincloud/tos/service/DouyinTosService.java

@@ -23,8 +23,9 @@ public interface DouyinTosService {
     // [抖音云TOS] 上传对象
     SysFileResult putObject(MultipartFile multipartFile, String object_key) throws IOException;
     // [抖音云TOS] 删除对象
-    void deleteObject(String object_key) throws IOException;
-
+    void deleteObject(String object_key);
+    // [抖音云TOS] 批量删除对象
+    void deleteObjects(List<String> object_keys);
 
     // [抖音云TOS] 初始化分块上传
     CreateMultipartUploadOutput initiateMultipartUpload(String object_name);

+ 48 - 0
src/main/java/com/backendsys/modules/sdk/douyincloud/tos/service/impl/DouyinTosServiceImpl.java

@@ -34,6 +34,7 @@ import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 // 对象接口 -> 上传对象
 // https://www.volcengine.com/docs/6349/79898
@@ -202,6 +203,53 @@ public class DouyinTosServiceImpl implements DouyinTosService {
         }
     }
 
+    // [抖音云TOS] 批量删除对象
+    @Override
+    public void deleteObjects(List<String> object_keys) {
+        try {
+
+            // 初始化 TosClient
+            TOSV2 tos = new TOSV2ClientBuilder().build(REGION, ENDPOINT, ACCESS_KEY_ID, SECRET_ACCESS_KEY);
+
+            List<ObjectTobeDeleted> objs = new ArrayList<>();
+            object_keys.stream().forEach(object_key -> {
+                ObjectTobeDeleted obj = new ObjectTobeDeleted().setKey(object_key);
+                objs.add(obj);
+            });
+
+            System.out.println("[抖音云TOS][即将删除对象]: " +
+                    object_keys.stream().collect(Collectors.joining(", ", "[", "]")));
+
+            DeleteMultiObjectsV2Input input = new DeleteMultiObjectsV2Input().setBucket(BUCKET_NAME).setObjects(objs);
+            DeleteMultiObjectsV2Output output = tos.deleteMultiObjects(input);
+            System.out.println("[抖音云TOS][批量删除对象成功].");
+
+            if (output.getDeleteds() != null) {
+                for (int i = 0; i < output.getDeleteds().size(); i++){
+                    Deleted deleted = output.getDeleteds().get(i);
+                    System.out.println("deleted object is " + deleted);
+                }
+            }
+            if (output.getErrors() != null) {
+                for (int i = 0; i < output.getErrors().size(); i++){
+                    DeleteError error = output.getErrors().get(i);
+                    System.out.println("delete error is " + error);
+                }
+            }
+
+            tos.close();
+
+        } catch (TosClientException e) {
+            System.out.println("deleteMultiObjects failed (TosClientException): " + e.getMessage());
+        } catch (TosServerException e) {
+            System.out.println("deleteMultiObjects failed (TosServerException): " + e.getMessage());
+        } catch (Throwable t) {
+            // 作为兜底捕获其他异常,一般不会执行到这里
+            System.out.println("deleteMultiObjects failed");
+            System.out.println("unexpected exception, message: " + t.getMessage());
+        }
+    }
+
 
     /**
      * [抖音云TOS] 初始化分块上传

+ 2 - 2
src/main/java/com/backendsys/modules/sdk/tencentcloud/cos/service/TencentCosService.java

@@ -20,8 +20,8 @@ public interface TencentCosService {
     // [腾讯云COS] 删除对象
     void deleteObject(String object_key);
 
-//    // [腾讯云COS] 批量删除对象
-//    void deleteObjects(String object_keys);
+    // [腾讯云COS] 批量删除对象
+    void deleteObjects(List<String> object_keys);
 
     // [腾讯云COS] 查询对象是否存在
     boolean doesObjectExist(String object_key);

+ 31 - 5
src/main/java/com/backendsys/modules/sdk/tencentcloud/cos/service/impl/TencentCosServiceImpl.java

@@ -19,6 +19,7 @@ import com.qcloud.cos.auth.BasicCOSCredentials;
 import com.qcloud.cos.auth.COSCredentials;
 import com.qcloud.cos.exception.CosClientException;
 import com.qcloud.cos.exception.CosServiceException;
+import com.qcloud.cos.exception.MultiObjectDeleteException;
 import com.qcloud.cos.http.HttpMethodName;
 import com.qcloud.cos.model.*;
 import com.qcloud.cos.region.Region;
@@ -35,9 +36,11 @@ import org.springframework.web.multipart.MultipartFile;
 import java.io.*;
 import java.math.BigDecimal;
 import java.net.URL;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 // 图片处理概述
 // https://cloud.tencent.com/document/product/436/42215
@@ -222,11 +225,34 @@ public class TencentCosServiceImpl implements TencentCosService {
         cosClient.shutdown();
     }
 
-//    // [腾讯云COS] 批量删除对象
-//    // https://cloud.tencent.com/document/product/436/65939#841fe310-bdf8-4789-9bc0-26ea844e316d
-//    @Override
-//    public void deleteObjects(String object_keys) {
-//    }
+    // [腾讯云COS] 批量删除对象
+    // https://cloud.tencent.com/document/product/436/65939#841fe310-bdf8-4789-9bc0-26ea844e316d
+    @Override
+    public void deleteObjects(List<String> object_keys) {
+        COSClient cosClient = getClient();
+
+        DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(BUCKET_NAME);
+        List<DeleteObjectsRequest.KeyVersion> keyList = new ArrayList<>();
+        object_keys.stream().forEach(object_key -> {
+            keyList.add(new DeleteObjectsRequest.KeyVersion(object_key));
+        });
+        deleteObjectsRequest.setKeys(keyList);
+
+        System.out.println("[腾讯云Cos][即将删除对象]: " +
+                keyList.stream()
+                .map(obj -> obj.getKey())
+                .collect(Collectors.joining(", ", "[", "]")));
+
+        DeleteObjectsResult deleteObjectsResult = cosClient.deleteObjects(deleteObjectsRequest);
+        List<DeleteObjectsResult.DeletedObject> deleteObjectResultArray = deleteObjectsResult.getDeletedObjects();
+
+        System.out.println("[腾讯云Cos][批量删除对象成功]: " +
+                deleteObjectResultArray.stream()
+                .map(obj -> obj.getKey())
+                .collect(Collectors.joining(", ", "[", "]")));
+
+        cosClient.shutdown();
+    }
 
 
     // [腾讯云COS] 生成临时图片地址

+ 11 - 0
src/main/java/com/backendsys/modules/upload/entity/ObjectKey.java

@@ -0,0 +1,11 @@
+package com.backendsys.modules.upload.entity;
+
+import lombok.Data;
+
+@Data
+public class ObjectKey {
+    String object_key;
+    Integer target;
+
+
+}

+ 1 - 5
src/main/java/com/backendsys/modules/upload/service/impl/SysFileServiceImpl.java

@@ -337,11 +337,7 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileDao, SysFile> impleme
         }
         if (target == 3) {
             // [抖音云] 删除对象
-            try {
-                douyinTosService.deleteObject(object_key);
-            } catch (IOException e) {
-                throw new RuntimeException(e);
-            }
+            douyinTosService.deleteObject(object_key);
             System.out.println("Delete douyin tos object: " + object_key);
         }
     }

+ 59 - 0
src/main/java/com/backendsys/modules/upload/utils/ObjectKeyUtil.java

@@ -0,0 +1,59 @@
+package com.backendsys.modules.upload.utils;
+
+import com.backendsys.modules.sdk.douyincloud.tos.service.DouyinTosService;
+import com.backendsys.modules.sdk.tencentcloud.cos.service.TencentCosService;
+import com.backendsys.modules.upload.entity.ObjectKey;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Component
+public class ObjectKeyUtil {
+
+    @Autowired
+    private TencentCosService tencentCosService;
+    @Autowired
+    private DouyinTosService douyinTosService;
+
+    /**
+     * 按 target 分组
+     */
+    public Map<Integer, List<ObjectKey>> groupByTarget(List<ObjectKey> objectKeys) {
+        return objectKeys.stream().collect(Collectors.groupingBy(ObjectKey::getTarget));
+    }
+
+    /**
+     * 批量删除 ObjectKeys (By target)
+     */
+    public void deleteObjects(List<ObjectKey> objectKeys) {
+
+        // 按 Target 分组 (-1:本地, 1:腾讯云, 2:阿里云, 3.抖音云)
+        Map<Integer, List<ObjectKey>> groups = groupByTarget(objectKeys);
+
+        // [腾讯云]
+        List<ObjectKey> tencent_object_keys = groups.get(1);
+        if (tencent_object_keys != null && !tencent_object_keys.isEmpty()) {
+            List<String> object_keys = tencent_object_keys.stream().map(ObjectKey::getObject_key).collect(Collectors.toList());
+            tencentCosService.deleteObjects(object_keys);
+        }
+
+        // [阿里云] (未开发)
+        List<ObjectKey> ali_object_keys = groups.get(2);
+        if (ali_object_keys != null && !ali_object_keys.isEmpty()) {
+            List<String> object_keys = ali_object_keys.stream().map(ObjectKey::getObject_key).collect(Collectors.toList());
+            System.out.println("(ali) object_keys (未开发) = " + object_keys);
+        }
+
+        // [抖音云]
+        List<ObjectKey> douyin_object_keys = groups.get(3);
+        if (douyin_object_keys != null && !douyin_object_keys.isEmpty()) {
+            List<String> object_keys = douyin_object_keys.stream().map(ObjectKey::getObject_key).collect(Collectors.toList());
+            douyinTosService.deleteObjects(object_keys);
+        }
+
+    }
+
+}

+ 2 - 0
src/main/java/com/backendsys/modules/upload/utils/UploadUtil.java

@@ -139,4 +139,6 @@ public class UploadUtil {
     }
 
 
+
+
 }