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.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<ServerFileBatchCopyObjectResponse> batchCopyObject(@Valid @RequestBody ServerFileBatchCopyObjectRequest request) {
AssertUtil.isFalse(Objects.isNull(request) || CollectionUtils.isEmpty(request.getCopyObjects()), "入参为空");
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());
}

View File

@ -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<FileBusinessScene> {
* 根据bucketNo与场景获取批量FileBusinessScene对象
*/
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.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<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")
private String appCode;
@NotBlank(message = "bizScene must not be null")
private String bizScene;
@NotEmpty(message = "集合对象不能为空")
private Set<ServerFileCopyObjectRequest> copyObjects;

View File

@ -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<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.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();

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.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<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.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<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.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<FileCopyObjectResponse> batchCopyObject(List<FileCopyObjectDto> dtoList, String appCode) {
public List<FileCopyObjectResponse> batchCopyObject(List<FileCopyObjectDto> dtoList, AppInfoDto appInfoDto) {
AssertUtil.isFalse(CollectionUtils.isEmpty(dtoList), "请求入参为空");
//校验appCode
this.checkAppCode(appCode);
this.checkAppCode(appInfoDto.getAppCode());
//通过fileKeys复制文件
List<CopyObjectCloudDto> cloudDtos = this.batchCopyObjectByFileKeys(dtoList);
List<CopyObjectCloudDto> cloudDtos = this.batchCopyObjectByFileKeys(dtoList, appInfoDto);
//保存文件表
return this.saveFiles(cloudDtos);
}
@ -1324,7 +1326,7 @@ public class FileServiceImpl implements FileService {
/**
* 通过fileKeys复制文件
*/
private List<CopyObjectCloudDto> batchCopyObjectByFileKeys(List<FileCopyObjectDto> dtoList) {
private List<CopyObjectCloudDto> batchCopyObjectByFileKeys(List<FileCopyObjectDto> dtoList, AppInfoDto appInfoDto) {
List<String> 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<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();
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<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);
}
/**
* 更新文件信息
*/