From 6a5e42c6531fb7fd217416f88c17bed6ce92ba88 Mon Sep 17 00:00:00 2001 From: xudawei Date: Thu, 20 Mar 2025 17:10:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:(REQ-3540)=20=E6=96=87=E4=BB=B6=E5=85=8B?= =?UTF-8?q?=E9=9A=86-=E5=8A=A0=E4=B8=8AbizScene,=E4=B8=8D=E4=BC=A0?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E6=A1=B6=E4=B8=8Ekey=EF=BC=8C=E5=88=99?= =?UTF-8?q?=E6=8C=89=E7=85=A7appCode=E4=B8=8EbizScene=E7=9A=84=E4=B8=BA?= =?UTF-8?q?=E5=87=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 3 +- .../dal/repository/FileBusinessSceneDao.java | 3 ++ .../impl/FileBusinessSceneDaoImpl.java | 9 ++++++ .../axzo/oss/dal/vo/FileBusinessSceneVo.java | 20 +++++++++++++ .../ServerFileBatchCopyObjectRequest.java | 3 ++ .../manager/api/FileBusinessSceneManager.java | 3 ++ .../manager/api/dto/request/AppInfoDto.java | 28 +++++++++++++++++ .../api/dto/request/CopyObjectCloudDto.java | 9 +++--- .../api/dto/request/FileBusinessSceneDto.java | 30 +++++++++++++++++++ .../impl/FileBusinessSceneManagerImpl.java | 7 ++++- .../cn/axzo/oss/service/api/FileService.java | 3 +- .../oss/service/impl/FileServiceImpl.java | 27 ++++++++++++----- 12 files changed, 131 insertions(+), 14 deletions(-) create mode 100644 oss-dal/src/main/java/cn/axzo/oss/dal/vo/FileBusinessSceneVo.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/AppInfoDto.java create mode 100644 oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FileBusinessSceneDto.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index 6ca999c..5160c98 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -35,6 +35,7 @@ import cn.axzo.oss.http.model.file.FileRenameRequest; import cn.axzo.oss.http.model.file.FileRenameResponse; import cn.axzo.oss.http.model.file.UpdateFileInfoRequest; import cn.axzo.oss.http.model.file.UpdateFileInfoResponse; +import cn.axzo.oss.manager.api.dto.request.AppInfoDto; import cn.axzo.oss.manager.api.dto.request.FileCopyObjectDto; import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto; import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto; @@ -244,7 +245,7 @@ public class ServerFileController implements ServerFileServiceApi { public CommonResponse batchCopyObject(@Valid @RequestBody ServerFileBatchCopyObjectRequest request) { AssertUtil.isFalse(Objects.isNull(request) || CollectionUtils.isEmpty(request.getCopyObjects()), "入参为空"); List fileCopyObjectDtos = BeanUtil.copyToList(request.getCopyObjects(), FileCopyObjectDto.class); - List fileCopyObjectResponses = fileService.batchCopyObject(fileCopyObjectDtos, request.getAppCode()); + List fileCopyObjectResponses = fileService.batchCopyObject(fileCopyObjectDtos, AppInfoDto.builder().appCode(request.getAppCode()).bizScene(request.getBizScene()).build()); return CommonResponse.success(ServerFileBatchCopyObjectResponse.builder().responses(BeanUtil.copyToList(fileCopyObjectResponses, ServerFileBatchCopyObjectResponse.ServerFileCopyObjectResponse.class)).build()); } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileBusinessSceneDao.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileBusinessSceneDao.java index 293be8e..a3c9c04 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileBusinessSceneDao.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/FileBusinessSceneDao.java @@ -1,6 +1,7 @@ package cn.axzo.oss.dal.repository; import cn.axzo.oss.dal.entity.FileBusinessScene; +import cn.axzo.oss.dal.vo.FileBusinessSceneVo; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; @@ -30,4 +31,6 @@ public interface FileBusinessSceneDao extends IService { * 根据bucketNo与场景,获取批量FileBusinessScene对象 */ List queryByBucketNoAndScene(Set bucketNoList, String bizScen); + + List findByCondition(FileBusinessSceneVo vo); } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileBusinessSceneDaoImpl.java b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileBusinessSceneDaoImpl.java index 92b5279..6bcf72e 100644 --- a/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileBusinessSceneDaoImpl.java +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/repository/impl/FileBusinessSceneDaoImpl.java @@ -4,6 +4,7 @@ import cn.axzo.oss.common.enums.IsDeleteEnum; import cn.axzo.oss.dal.entity.FileBusinessScene; import cn.axzo.oss.dal.mapper.FileBusinessSceneMapper; import cn.axzo.oss.dal.repository.FileBusinessSceneDao; +import cn.axzo.oss.dal.vo.FileBusinessSceneVo; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import org.apache.commons.lang3.StringUtils; @@ -50,4 +51,12 @@ public class FileBusinessSceneDaoImpl extends .eq(StringUtils.isNotBlank(bizScene), FileBusinessScene::getBusinessScene, StringUtils.isNotBlank(bizScene) ? bizScene : StringUtils.EMPTY) .eq(FileBusinessScene::getIsDelete, IsDeleteEnum.NO.getCode()).list(); } + + @Override + public List findByCondition(FileBusinessSceneVo vo) { + return lambdaQuery().eq(FileBusinessScene::getAppCode, vo.getAppCode()) + .eq(FileBusinessScene::getBusinessScene,vo.getBusinessScene()) + .eq(FileBusinessScene::getIsDelete, IsDeleteEnum.NO.getCode()).list(); + } + } diff --git a/oss-dal/src/main/java/cn/axzo/oss/dal/vo/FileBusinessSceneVo.java b/oss-dal/src/main/java/cn/axzo/oss/dal/vo/FileBusinessSceneVo.java new file mode 100644 index 0000000..b86f9c8 --- /dev/null +++ b/oss-dal/src/main/java/cn/axzo/oss/dal/vo/FileBusinessSceneVo.java @@ -0,0 +1,20 @@ +package cn.axzo.oss.dal.vo; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author xudawei@axzo.cn + * @date 2025/3/20 + * @description FileBusinessSceneVo + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class FileBusinessSceneVo { + private String appCode; + private String businessScene; +} diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/copyobject/ServerFileBatchCopyObjectRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/copyobject/ServerFileBatchCopyObjectRequest.java index 3b85a78..9157f4c 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/copyobject/ServerFileBatchCopyObjectRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/copyobject/ServerFileBatchCopyObjectRequest.java @@ -24,6 +24,9 @@ public class ServerFileBatchCopyObjectRequest { @NotBlank(message = "appCode must not be null") private String appCode; + @NotBlank(message = "bizScene must not be null") + private String bizScene; + @NotEmpty(message = "集合对象不能为空") private Set copyObjects; diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileBusinessSceneManager.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileBusinessSceneManager.java index 4eb53ff..f0ce799 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileBusinessSceneManager.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/FileBusinessSceneManager.java @@ -1,6 +1,7 @@ package cn.axzo.oss.manager.api; import cn.axzo.oss.dal.entity.FileBusinessScene; +import cn.axzo.oss.dal.vo.FileBusinessSceneVo; import java.util.List; import java.util.Set; @@ -25,4 +26,6 @@ public interface FileBusinessSceneManager { * 指定appcode文件业务场景 */ List queryByBucketNoAndScene(Set bucketNoList, String bizScene); + + List findByCondition(FileBusinessSceneVo vo); } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/AppInfoDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/AppInfoDto.java new file mode 100644 index 0000000..e25496e --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/AppInfoDto.java @@ -0,0 +1,28 @@ +package cn.axzo.oss.manager.api.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author xudawei@axzo.cn + * @date 2025/3/20 + * @description app + */ +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AppInfoDto { + + /** + * appCode + */ + private String appCode; + /** + * bizScene + */ + private String bizScene; + +} diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/CopyObjectCloudDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/CopyObjectCloudDto.java index 90375ca..ccbc884 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/CopyObjectCloudDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/CopyObjectCloudDto.java @@ -2,6 +2,7 @@ package cn.axzo.oss.manager.api.dto.request; import cn.axzo.oss.common.utils.Utility; import cn.axzo.oss.dal.entity.File; +import cn.axzo.oss.dal.entity.FileBusinessScene; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -64,11 +65,11 @@ public class CopyObjectCloudDto { private File file; private String fileUuid; - public static CopyObjectCloudDto create(FileCopyObjectDto fileCopyObjectRequest, File file) { + public static CopyObjectCloudDto create(FileCopyObjectDto fileCopyObjectRequest, File file, FileBusinessScene fileBusinessScene) { // 入参中有通道,则优先取入参;否则取源通道 - String targetChannelCode = StringUtils.isBlank(fileCopyObjectRequest.getTargetChannelCode()) ? file.getChannelCode() : fileCopyObjectRequest.getTargetChannelCode(); - String targetBucketName = StringUtils.isBlank(fileCopyObjectRequest.getTargetBucketName()) ? file.getBucketName() : fileCopyObjectRequest.getTargetBucketName(); - String targetBucketDict = StringUtils.isBlank(fileCopyObjectRequest.getTargetDict()) ? file.getDirectory() : fileCopyObjectRequest.getTargetDict(); + String targetChannelCode = StringUtils.isBlank(fileCopyObjectRequest.getTargetChannelCode()) ? fileBusinessScene.getChannelCode() : fileCopyObjectRequest.getTargetChannelCode(); + String targetBucketName = StringUtils.isBlank(fileCopyObjectRequest.getTargetBucketName()) ? fileBusinessScene.getBucketName() : fileCopyObjectRequest.getTargetBucketName(); + String targetBucketDict = StringUtils.isBlank(fileCopyObjectRequest.getTargetDict()) ? fileBusinessScene.getDirectory() : fileCopyObjectRequest.getTargetDict(); String fileName = StringUtils.isBlank(fileCopyObjectRequest.getTargetFileName()) ? file.getFileName() : fileCopyObjectRequest.getTargetFileName(); String uuid = Utility.getUUID(); diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FileBusinessSceneDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FileBusinessSceneDto.java new file mode 100644 index 0000000..0b22a70 --- /dev/null +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/FileBusinessSceneDto.java @@ -0,0 +1,30 @@ +package cn.axzo.oss.manager.api.dto.request; + +import com.baomidou.mybatisplus.annotation.TableField; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @author xudawei@axzo.cn + * @date 2025/3/20 + * @description FileBusinessSceneDto + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class FileBusinessSceneDto { + + /** + * 应用编码 + */ + private String appCode; + + /** + * 业务场景 + */ + private String businessScene; + +} diff --git a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileBusinessSceneManagerImpl.java b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileBusinessSceneManagerImpl.java index 9746d2c..685ffc9 100644 --- a/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileBusinessSceneManagerImpl.java +++ b/oss-manager/src/main/java/cn/axzo/oss/manager/impl/FileBusinessSceneManagerImpl.java @@ -4,10 +4,10 @@ import cn.axzo.oss.common.enums.CodeEnum; import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.dal.entity.FileBusinessScene; import cn.axzo.oss.dal.repository.FileBusinessSceneDao; +import cn.axzo.oss.dal.vo.FileBusinessSceneVo; import cn.axzo.oss.manager.api.FileBusinessSceneManager; import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -53,4 +53,9 @@ public class FileBusinessSceneManagerImpl implements FileBusinessSceneManager { return fileBusinessSceneDao .queryByBucketNoAndScene(bucketNoList, bizScene); } + + @Override + public List findByCondition(FileBusinessSceneVo vo) { + return fileBusinessSceneDao.findByCondition(vo); + } } diff --git a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java index 0523cdb..8a67ab9 100644 --- a/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java +++ b/oss-service-api/src/main/java/cn/axzo/oss/service/api/FileService.java @@ -3,6 +3,7 @@ package cn.axzo.oss.service.api; import cn.axzo.framework.auth.domain.ContextInfo; import cn.axzo.oss.dal.entity.AppChannelBucket; import cn.axzo.oss.dal.entity.FileUploadConfig; +import cn.axzo.oss.manager.api.dto.request.AppInfoDto; import cn.axzo.oss.manager.api.dto.request.DeleteFileDto; import cn.axzo.oss.manager.api.dto.request.FileCopyObjectDto; import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto; @@ -127,7 +128,7 @@ public interface FileService { * 1 不同通道,则通过url进行复制 * 2 相同通道,则直接调用复制方法 */ - List batchCopyObject(List dtoList, String appCode); + List batchCopyObject(List dtoList, AppInfoDto appInfoDto); /** * 更新文件信息 diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index 607ba84..6153818 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -26,12 +26,14 @@ import cn.axzo.oss.dal.entity.FileBusinessScene; import cn.axzo.oss.dal.entity.FileUploadConfig; import cn.axzo.oss.dal.repository.FileAppDao; import cn.axzo.oss.dal.repository.FileDao; +import cn.axzo.oss.dal.vo.FileBusinessSceneVo; import cn.axzo.oss.integration.s3.config.HuaWeiCloudObsConfig; import cn.axzo.oss.manager.api.AppChannelBucketManager; import cn.axzo.oss.manager.api.FileBusinessSceneManager; import cn.axzo.oss.manager.api.FileManager; import cn.axzo.oss.manager.api.FileUploadConfigManager; import cn.axzo.oss.manager.api.dto.PartETag; +import cn.axzo.oss.manager.api.dto.request.AppInfoDto; import cn.axzo.oss.manager.api.dto.request.CopyObjectCloudDto; import cn.axzo.oss.manager.api.dto.request.DeleteFileDto; import cn.axzo.oss.manager.api.dto.request.FileCopyObjectDto; @@ -1268,12 +1270,12 @@ public class FileServiceImpl implements FileService { * 1 不同通道,则通过url进行复制 * 2 相同通道,则直接调用复制方法 */ - public List batchCopyObject(List dtoList, String appCode) { + public List batchCopyObject(List dtoList, AppInfoDto appInfoDto) { AssertUtil.isFalse(CollectionUtils.isEmpty(dtoList), "请求入参为空"); //校验appCode - this.checkAppCode(appCode); + this.checkAppCode(appInfoDto.getAppCode()); //通过fileKeys复制文件 - List cloudDtos = this.batchCopyObjectByFileKeys(dtoList); + List cloudDtos = this.batchCopyObjectByFileKeys(dtoList, appInfoDto); //保存文件表 return this.saveFiles(cloudDtos); } @@ -1324,7 +1326,7 @@ public class FileServiceImpl implements FileService { /** * 通过fileKeys复制文件 */ - private List batchCopyObjectByFileKeys(List dtoList) { + private List batchCopyObjectByFileKeys(List dtoList, AppInfoDto appInfoDto) { List fileKeys = dtoList.stream() .filter(item -> StringUtils.isNotBlank(item.getSrcFileKey())) .map(FileCopyObjectDto::getSrcFileKey).collect(Collectors.toList()); @@ -1339,7 +1341,7 @@ public class FileServiceImpl implements FileService { return Lists.newArrayList(); } //通过文件表,完成文件对象复制 - return this.doBatchCopyObjectByFiles(reqFileKeyMap, fileList); + return this.doBatchCopyObjectByFiles(reqFileKeyMap, fileList, appInfoDto); } /** @@ -1347,8 +1349,9 @@ public class FileServiceImpl implements FileService { * 注意,此方法是根据业务文件复制 * 底层通用方法fileManager.copyObjects(dto); */ - private List doBatchCopyObjectByFiles(Map reqFileKeyMap, List fileList) { + private List doBatchCopyObjectByFiles(Map reqFileKeyMap, List fileList, AppInfoDto appInfoDto) { List returnList = Lists.newArrayList(); + FileBusinessScene fileBusinessScene = this.fetchBizSceneByAppCodeAndBizScene(appInfoDto); for (File file : fileList) { if (Objects.isNull(reqFileKeyMap.get(file.getFileUuid()))) { continue; @@ -1357,7 +1360,7 @@ public class FileServiceImpl implements FileService { if (Objects.isNull(fileCopyObjectRequest)) { continue; } - CopyObjectCloudDto dto = CopyObjectCloudDto.create(fileCopyObjectRequest, file); + CopyObjectCloudDto dto = CopyObjectCloudDto.create(fileCopyObjectRequest, file, fileBusinessScene); this.fileManager.copyObjects(dto); returnList.add(dto); @@ -1365,6 +1368,16 @@ public class FileServiceImpl implements FileService { return returnList; } + private FileBusinessScene fetchBizSceneByAppCodeAndBizScene(AppInfoDto appInfoDto) { + List list = this.fileBusinessSceneManager.findByCondition(FileBusinessSceneVo.builder() + .appCode(appInfoDto.getAppCode()) + .businessScene(appInfoDto.getBizScene()) + .build()); + AssertUtil.notEmpty(list, "文件业务场景未配置"); + AssertUtil.isFalse(list.size() > 1, "文件业务场景匹配多个"); + return list.get(0); + } + /** * 更新文件信息 */