feat:(REQ-3540) 文件克隆-加上bizScene,不传目标桶与key,则按照appCode与bizScene的为准

This commit is contained in:
xudawei 2025-03-20 17:10:11 +08:00
parent 54d8ffb985
commit 6a5e42c653
12 changed files with 131 additions and 14 deletions

View File

@ -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.FileRenameResponse;
import cn.axzo.oss.http.model.file.UpdateFileInfoRequest; import cn.axzo.oss.http.model.file.UpdateFileInfoRequest;
import cn.axzo.oss.http.model.file.UpdateFileInfoResponse; 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.FileCopyObjectDto;
import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto; import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto;
import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto; import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto;
@ -244,7 +245,7 @@ public class ServerFileController implements ServerFileServiceApi {
public CommonResponse<ServerFileBatchCopyObjectResponse> batchCopyObject(@Valid @RequestBody ServerFileBatchCopyObjectRequest request) { public CommonResponse<ServerFileBatchCopyObjectResponse> batchCopyObject(@Valid @RequestBody ServerFileBatchCopyObjectRequest request) {
AssertUtil.isFalse(Objects.isNull(request) || CollectionUtils.isEmpty(request.getCopyObjects()), "入参为空"); AssertUtil.isFalse(Objects.isNull(request) || CollectionUtils.isEmpty(request.getCopyObjects()), "入参为空");
List<FileCopyObjectDto> fileCopyObjectDtos = BeanUtil.copyToList(request.getCopyObjects(), FileCopyObjectDto.class); List<FileCopyObjectDto> fileCopyObjectDtos = BeanUtil.copyToList(request.getCopyObjects(), FileCopyObjectDto.class);
List<FileCopyObjectResponse> fileCopyObjectResponses = fileService.batchCopyObject(fileCopyObjectDtos, request.getAppCode()); List<FileCopyObjectResponse> 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()); return CommonResponse.success(ServerFileBatchCopyObjectResponse.builder().responses(BeanUtil.copyToList(fileCopyObjectResponses, ServerFileBatchCopyObjectResponse.ServerFileCopyObjectResponse.class)).build());
} }

View File

@ -1,6 +1,7 @@
package cn.axzo.oss.dal.repository; package cn.axzo.oss.dal.repository;
import cn.axzo.oss.dal.entity.FileBusinessScene; import cn.axzo.oss.dal.entity.FileBusinessScene;
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List; import java.util.List;
@ -30,4 +31,6 @@ public interface FileBusinessSceneDao extends IService<FileBusinessScene> {
* 根据bucketNo与场景获取批量FileBusinessScene对象 * 根据bucketNo与场景获取批量FileBusinessScene对象
*/ */
List<FileBusinessScene> queryByBucketNoAndScene(Set<String> bucketNoList, String bizScen); List<FileBusinessScene> queryByBucketNoAndScene(Set<String> bucketNoList, String bizScen);
List<FileBusinessScene> findByCondition(FileBusinessSceneVo vo);
} }

View File

@ -4,6 +4,7 @@ import cn.axzo.oss.common.enums.IsDeleteEnum;
import cn.axzo.oss.dal.entity.FileBusinessScene; import cn.axzo.oss.dal.entity.FileBusinessScene;
import cn.axzo.oss.dal.mapper.FileBusinessSceneMapper; import cn.axzo.oss.dal.mapper.FileBusinessSceneMapper;
import cn.axzo.oss.dal.repository.FileBusinessSceneDao; import cn.axzo.oss.dal.repository.FileBusinessSceneDao;
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.apache.commons.lang3.StringUtils; 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(StringUtils.isNotBlank(bizScene), FileBusinessScene::getBusinessScene, StringUtils.isNotBlank(bizScene) ? bizScene : StringUtils.EMPTY)
.eq(FileBusinessScene::getIsDelete, IsDeleteEnum.NO.getCode()).list(); .eq(FileBusinessScene::getIsDelete, IsDeleteEnum.NO.getCode()).list();
} }
@Override
public List<FileBusinessScene> findByCondition(FileBusinessSceneVo vo) {
return lambdaQuery().eq(FileBusinessScene::getAppCode, vo.getAppCode())
.eq(FileBusinessScene::getBusinessScene,vo.getBusinessScene())
.eq(FileBusinessScene::getIsDelete, IsDeleteEnum.NO.getCode()).list();
}
} }

View File

@ -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;
}

View File

@ -24,6 +24,9 @@ public class ServerFileBatchCopyObjectRequest {
@NotBlank(message = "appCode must not be null") @NotBlank(message = "appCode must not be null")
private String appCode; private String appCode;
@NotBlank(message = "bizScene must not be null")
private String bizScene;
@NotEmpty(message = "集合对象不能为空") @NotEmpty(message = "集合对象不能为空")
private Set<ServerFileCopyObjectRequest> copyObjects; private Set<ServerFileCopyObjectRequest> copyObjects;

View File

@ -1,6 +1,7 @@
package cn.axzo.oss.manager.api; package cn.axzo.oss.manager.api;
import cn.axzo.oss.dal.entity.FileBusinessScene; import cn.axzo.oss.dal.entity.FileBusinessScene;
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -25,4 +26,6 @@ public interface FileBusinessSceneManager {
* 指定appcode文件业务场景 * 指定appcode文件业务场景
*/ */
List<FileBusinessScene> queryByBucketNoAndScene(Set<String> bucketNoList, String bizScene); List<FileBusinessScene> queryByBucketNoAndScene(Set<String> bucketNoList, String bizScene);
List<FileBusinessScene> findByCondition(FileBusinessSceneVo vo);
} }

View File

@ -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;
}

View File

@ -2,6 +2,7 @@ package cn.axzo.oss.manager.api.dto.request;
import cn.axzo.oss.common.utils.Utility; import cn.axzo.oss.common.utils.Utility;
import cn.axzo.oss.dal.entity.File; import cn.axzo.oss.dal.entity.File;
import cn.axzo.oss.dal.entity.FileBusinessScene;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@ -64,11 +65,11 @@ public class CopyObjectCloudDto {
private File file; private File file;
private String fileUuid; 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 targetChannelCode = StringUtils.isBlank(fileCopyObjectRequest.getTargetChannelCode()) ? fileBusinessScene.getChannelCode() : fileCopyObjectRequest.getTargetChannelCode();
String targetBucketName = StringUtils.isBlank(fileCopyObjectRequest.getTargetBucketName()) ? file.getBucketName() : fileCopyObjectRequest.getTargetBucketName(); String targetBucketName = StringUtils.isBlank(fileCopyObjectRequest.getTargetBucketName()) ? fileBusinessScene.getBucketName() : fileCopyObjectRequest.getTargetBucketName();
String targetBucketDict = StringUtils.isBlank(fileCopyObjectRequest.getTargetDict()) ? file.getDirectory() : fileCopyObjectRequest.getTargetDict(); String targetBucketDict = StringUtils.isBlank(fileCopyObjectRequest.getTargetDict()) ? fileBusinessScene.getDirectory() : fileCopyObjectRequest.getTargetDict();
String fileName = StringUtils.isBlank(fileCopyObjectRequest.getTargetFileName()) ? file.getFileName() : fileCopyObjectRequest.getTargetFileName(); String fileName = StringUtils.isBlank(fileCopyObjectRequest.getTargetFileName()) ? file.getFileName() : fileCopyObjectRequest.getTargetFileName();
String uuid = Utility.getUUID(); String uuid = Utility.getUUID();

View File

@ -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;
}

View File

@ -4,10 +4,10 @@ import cn.axzo.oss.common.enums.CodeEnum;
import cn.axzo.oss.common.exception.BizException; import cn.axzo.oss.common.exception.BizException;
import cn.axzo.oss.dal.entity.FileBusinessScene; import cn.axzo.oss.dal.entity.FileBusinessScene;
import cn.axzo.oss.dal.repository.FileBusinessSceneDao; import cn.axzo.oss.dal.repository.FileBusinessSceneDao;
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
import cn.axzo.oss.manager.api.FileBusinessSceneManager; import cn.axzo.oss.manager.api.FileBusinessSceneManager;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@ -53,4 +53,9 @@ public class FileBusinessSceneManagerImpl implements FileBusinessSceneManager {
return fileBusinessSceneDao return fileBusinessSceneDao
.queryByBucketNoAndScene(bucketNoList, bizScene); .queryByBucketNoAndScene(bucketNoList, bizScene);
} }
@Override
public List<FileBusinessScene> findByCondition(FileBusinessSceneVo vo) {
return fileBusinessSceneDao.findByCondition(vo);
}
} }

View File

@ -3,6 +3,7 @@ package cn.axzo.oss.service.api;
import cn.axzo.framework.auth.domain.ContextInfo; import cn.axzo.framework.auth.domain.ContextInfo;
import cn.axzo.oss.dal.entity.AppChannelBucket; import cn.axzo.oss.dal.entity.AppChannelBucket;
import cn.axzo.oss.dal.entity.FileUploadConfig; 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.DeleteFileDto;
import cn.axzo.oss.manager.api.dto.request.FileCopyObjectDto; 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.FindFileKeyDto;
@ -127,7 +128,7 @@ public interface FileService {
* 1 不同通道则通过url进行复制 * 1 不同通道则通过url进行复制
* 2 相同通道则直接调用复制方法 * 2 相同通道则直接调用复制方法
*/ */
List<FileCopyObjectResponse> batchCopyObject(List<FileCopyObjectDto> dtoList, String appCode); List<FileCopyObjectResponse> batchCopyObject(List<FileCopyObjectDto> dtoList, AppInfoDto appInfoDto);
/** /**
* 更新文件信息 * 更新文件信息

View File

@ -26,12 +26,14 @@ import cn.axzo.oss.dal.entity.FileBusinessScene;
import cn.axzo.oss.dal.entity.FileUploadConfig; import cn.axzo.oss.dal.entity.FileUploadConfig;
import cn.axzo.oss.dal.repository.FileAppDao; import cn.axzo.oss.dal.repository.FileAppDao;
import cn.axzo.oss.dal.repository.FileDao; 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.integration.s3.config.HuaWeiCloudObsConfig;
import cn.axzo.oss.manager.api.AppChannelBucketManager; import cn.axzo.oss.manager.api.AppChannelBucketManager;
import cn.axzo.oss.manager.api.FileBusinessSceneManager; import cn.axzo.oss.manager.api.FileBusinessSceneManager;
import cn.axzo.oss.manager.api.FileManager; import cn.axzo.oss.manager.api.FileManager;
import cn.axzo.oss.manager.api.FileUploadConfigManager; import cn.axzo.oss.manager.api.FileUploadConfigManager;
import cn.axzo.oss.manager.api.dto.PartETag; 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.CopyObjectCloudDto;
import cn.axzo.oss.manager.api.dto.request.DeleteFileDto; 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.FileCopyObjectDto;
@ -1268,12 +1270,12 @@ public class FileServiceImpl implements FileService {
* 1 不同通道则通过url进行复制 * 1 不同通道则通过url进行复制
* 2 相同通道则直接调用复制方法 * 2 相同通道则直接调用复制方法
*/ */
public List<FileCopyObjectResponse> batchCopyObject(List<FileCopyObjectDto> dtoList, String appCode) { public List<FileCopyObjectResponse> batchCopyObject(List<FileCopyObjectDto> dtoList, AppInfoDto appInfoDto) {
AssertUtil.isFalse(CollectionUtils.isEmpty(dtoList), "请求入参为空"); AssertUtil.isFalse(CollectionUtils.isEmpty(dtoList), "请求入参为空");
//校验appCode //校验appCode
this.checkAppCode(appCode); this.checkAppCode(appInfoDto.getAppCode());
//通过fileKeys复制文件 //通过fileKeys复制文件
List<CopyObjectCloudDto> cloudDtos = this.batchCopyObjectByFileKeys(dtoList); List<CopyObjectCloudDto> cloudDtos = this.batchCopyObjectByFileKeys(dtoList, appInfoDto);
//保存文件表 //保存文件表
return this.saveFiles(cloudDtos); return this.saveFiles(cloudDtos);
} }
@ -1324,7 +1326,7 @@ public class FileServiceImpl implements FileService {
/** /**
* 通过fileKeys复制文件 * 通过fileKeys复制文件
*/ */
private List<CopyObjectCloudDto> batchCopyObjectByFileKeys(List<FileCopyObjectDto> dtoList) { private List<CopyObjectCloudDto> batchCopyObjectByFileKeys(List<FileCopyObjectDto> dtoList, AppInfoDto appInfoDto) {
List<String> fileKeys = dtoList.stream() List<String> fileKeys = dtoList.stream()
.filter(item -> StringUtils.isNotBlank(item.getSrcFileKey())) .filter(item -> StringUtils.isNotBlank(item.getSrcFileKey()))
.map(FileCopyObjectDto::getSrcFileKey).collect(Collectors.toList()); .map(FileCopyObjectDto::getSrcFileKey).collect(Collectors.toList());
@ -1339,7 +1341,7 @@ public class FileServiceImpl implements FileService {
return Lists.newArrayList(); 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); * 底层通用方法fileManager.copyObjects(dto);
*/ */
private List<CopyObjectCloudDto> doBatchCopyObjectByFiles(Map<String, FileCopyObjectDto> reqFileKeyMap, List<File> fileList) { private List<CopyObjectCloudDto> doBatchCopyObjectByFiles(Map<String, FileCopyObjectDto> reqFileKeyMap, List<File> fileList, AppInfoDto appInfoDto) {
List<CopyObjectCloudDto> returnList = Lists.newArrayList(); List<CopyObjectCloudDto> returnList = Lists.newArrayList();
FileBusinessScene fileBusinessScene = this.fetchBizSceneByAppCodeAndBizScene(appInfoDto);
for (File file : fileList) { for (File file : fileList) {
if (Objects.isNull(reqFileKeyMap.get(file.getFileUuid()))) { if (Objects.isNull(reqFileKeyMap.get(file.getFileUuid()))) {
continue; continue;
@ -1357,7 +1360,7 @@ public class FileServiceImpl implements FileService {
if (Objects.isNull(fileCopyObjectRequest)) { if (Objects.isNull(fileCopyObjectRequest)) {
continue; continue;
} }
CopyObjectCloudDto dto = CopyObjectCloudDto.create(fileCopyObjectRequest, file); CopyObjectCloudDto dto = CopyObjectCloudDto.create(fileCopyObjectRequest, file, fileBusinessScene);
this.fileManager.copyObjects(dto); this.fileManager.copyObjects(dto);
returnList.add(dto); returnList.add(dto);
@ -1365,6 +1368,16 @@ public class FileServiceImpl implements FileService {
return returnList; return returnList;
} }
private FileBusinessScene fetchBizSceneByAppCodeAndBizScene(AppInfoDto appInfoDto) {
List<FileBusinessScene> 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);
}
/** /**
* 更新文件信息 * 更新文件信息
*/ */