Commit 06cbc20d by zhangxingmin

push

parent 0378b7bd
package com.yd.oss.api.service.impl; package com.yd.oss.api.service.impl;
import com.aliyun.oss.OSS;
import com.yd.common.exception.BusinessException; import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result; import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiExcelService; import com.yd.oss.api.service.ApiExcelService;
...@@ -10,10 +11,9 @@ import com.yd.oss.feign.response.ApiOssExportAppointmentExcelResponse; ...@@ -10,10 +11,9 @@ import com.yd.oss.feign.response.ApiOssExportAppointmentExcelResponse;
import com.yd.oss.feign.dto.ExportParam; import com.yd.oss.feign.dto.ExportParam;
import com.yd.oss.feign.dto.ExportResult; import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.feign.result.ImportResult; import com.yd.oss.feign.result.ImportResult;
import com.yd.oss.service.service.AppointmentExcelService; import com.yd.oss.service.config.OssClientFactory;
import com.yd.oss.service.service.ExcelExportService; import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.service.ExcelImportService; import com.yd.oss.service.service.*;
import com.yd.oss.service.service.ExcelParserService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -41,6 +41,12 @@ public class ApiExcelServiceImpl implements ApiExcelService { ...@@ -41,6 +41,12 @@ public class ApiExcelServiceImpl implements ApiExcelService {
@Autowired @Autowired
private ExcelImportService excelImportService; private ExcelImportService excelImportService;
@Autowired
private OssClientFactory ossClientFactory;
@Autowired
private IOssProviderService ossProviderService;
/** /**
* 导出excel-预约信息 * 导出excel-预约信息
* @param request * @param request
...@@ -49,9 +55,17 @@ public class ApiExcelServiceImpl implements ApiExcelService { ...@@ -49,9 +55,17 @@ public class ApiExcelServiceImpl implements ApiExcelService {
@Override @Override
public Result<ApiOssExportAppointmentExcelResponse> exportAppointment(ApiOssExportAppointmentExcelRequest request) { public Result<ApiOssExportAppointmentExcelResponse> exportAppointment(ApiOssExportAppointmentExcelRequest request) {
ApiOssExportAppointmentExcelResponse response = new ApiOssExportAppointmentExcelResponse(); ApiOssExportAppointmentExcelResponse response = new ApiOssExportAppointmentExcelResponse();
// 根据项目ID获取服务商信息
OssProvider provider = ossProviderService.getProviderByProjectId(request.getProjectBizId());
if (provider == null) {
log.error("未找到项目对应的OSS服务商,projectBizId={}", request.getProjectBizId());
return Result.fail("未找到对应的OSS服务商配置");
}
OSS tempClient = ossClientFactory.createOssClient(provider);
String url = appointmentExcelService.exportAppointment(request.getData(), String url = appointmentExcelService.exportAppointment(request.getData(),
request.getTemplateType(), request.getTemplateType(),
request.getAppointmentBizId()); request.getAppointmentBizId(),
request.getProjectBizId());
response.setUrl(url); response.setUrl(url);
return Result.success(response); return Result.success(response);
} }
......
...@@ -13,6 +13,9 @@ import com.yd.common.enums.CommonEnum; ...@@ -13,6 +13,9 @@ import com.yd.common.enums.CommonEnum;
import com.yd.common.result.Result; import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator; import com.yd.common.utils.RandomStringGenerator;
import com.yd.oss.api.service.ApiOssStsService; import com.yd.oss.api.service.ApiOssStsService;
import com.yd.oss.service.config.OssClientFactory;
import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.service.IOssProviderService;
import com.yd.oss.service.utils.OssUtils; import com.yd.oss.service.utils.OssUtils;
import com.yd.oss.feign.dto.ApiOssFileDto; import com.yd.oss.feign.dto.ApiOssFileDto;
import com.yd.oss.feign.request.ApiBatchSaveFilesRequest; import com.yd.oss.feign.request.ApiBatchSaveFilesRequest;
...@@ -20,9 +23,7 @@ import com.yd.oss.feign.response.ApiBatchSaveFilesResponse; ...@@ -20,9 +23,7 @@ import com.yd.oss.feign.response.ApiBatchSaveFilesResponse;
import com.yd.oss.feign.response.ApiGetStsTokenResponse; import com.yd.oss.feign.response.ApiGetStsTokenResponse;
import com.yd.oss.feign.response.ApiOssFileResponse; import com.yd.oss.feign.response.ApiOssFileResponse;
import com.yd.oss.service.model.OssFile; import com.yd.oss.service.model.OssFile;
import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.service.IOssFileService; import com.yd.oss.service.service.IOssFileService;
import com.yd.oss.service.service.OssService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
...@@ -31,6 +32,7 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -31,6 +32,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.time.LocalDateTime; import java.time.LocalDateTime;
...@@ -41,34 +43,15 @@ import java.util.List; ...@@ -41,34 +43,15 @@ import java.util.List;
@Service @Service
public class ApiOssStsServiceImpl implements ApiOssStsService { public class ApiOssStsServiceImpl implements ApiOssStsService {
// @Value("${aliyun.oss.access-key-id:LTAI5tFNiaUM3B4vC2bjqvtB}")
// private String accessKeyId;
//
// @Value("${aliyun.oss.access-key-secret:yH2L5YYmUayBYpQXhYevJ6Ghba349D}")
// private String accessKeySecret;
//
@Value("${aliyun.oss.role-arn:acs:ram::1164861558430519:role/oss-upload-role}") @Value("${aliyun.oss.role-arn:acs:ram::1164861558430519:role/oss-upload-role}")
private String roleArn; private String roleArn;
//
// @Value("${aliyun.oss.region:cn-shanghai}")
// private String region;
//
// @Value("${aliyun.oss.bucket:yd-ali-oss}")
// private String bucket;
//
// @Value("${aliyun.oss.endpoint:oss-cn-shanghai-finance-1-pub.aliyuncs.com}")
// private String endpoint;
//
// 注入最大文件大小配置,默认100MB // 注入最大文件大小配置,默认100MB
@Value("${aliyun.oss.max-size:104857600}") @Value("${aliyun.oss.max-size:104857600}")
private Long maxSize; private Long maxSize;
@Autowired @Autowired
private OssService ossService; private IOssProviderService ossProviderService;
// 动态代理的 OSS 客户端,会自动切换到当前服务商
@Autowired
private OSS ossClient;
@Autowired @Autowired
private IOssFileService iOssFileService; private IOssFileService iOssFileService;
...@@ -76,32 +59,40 @@ public class ApiOssStsServiceImpl implements ApiOssStsService { ...@@ -76,32 +59,40 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
@Autowired @Autowired
private OssUtils ossUtils; private OssUtils ossUtils;
@Autowired
private OssClientFactory ossClientFactory; // 如果需要执行OSS操作时使用
/** /**
* getStsToken如何根据传入的projectBizId查询对应服务商然后切换对应OSS服务商 * 获取STS临时凭证
* @param projectBizId * @param projectBizId 项目业务ID,用于确定使用的OSS服务商
* @return * @return STS凭证响应
*/ */
@Override @Override
public Result<ApiGetStsTokenResponse> getStsToken(String projectBizId) { public Result<ApiGetStsTokenResponse> getStsToken(String projectBizId) {
// 切换服务商 // 根据项目ID获取服务商信息
ossService.switchProviderByProjectId(projectBizId); OssProvider provider = ossProviderService.getProviderByProjectId(projectBizId);
if (provider == null) {
// 获取切换后的服务商信息 log.error("未找到项目对应的OSS服务商,projectBizId={}", projectBizId);
OssProvider currentProvider = ossService.getCurrentProvider(); return Result.fail("未找到对应的OSS服务商配置");
String region = currentProvider.getRegion();
String accessKeyId = currentProvider.getAccessKey();
String accessKeySecret = currentProvider.getSecretKey();
// 或 ossService.getDefaultBucket()
String bucket = currentProvider.getBucketName();
// 或 ossService.getDefaultEndpoint()
String endpoint = currentProvider.getEndpoint();
//现在 ossClient 已经指向了切换后的服务商,可以直接使用
if (!ossClient.doesBucketExist(bucket)) {
log.warn("当前服务商的桶 {} 不存在,将尝试创建", bucket);
// 可以创建桶,但通常桶应提前准备好
} }
String region = provider.getRegion();
String accessKeyId = provider.getAccessKey();
String accessKeySecret = provider.getSecretKey();
String bucket = provider.getBucketName();
String endpoint = provider.getEndpoint();
// 检查bucket是否存在
// 如果需要检查,可以用ossClientFactory创建临时客户端执行操作,然后关闭
OSS tempClient = ossClientFactory.createOssClient(provider);
try {
if (!tempClient.doesBucketExist(bucket)) {
log.warn("当前服务商的桶 {} 不存在,请确认配置", bucket);
}
} finally {
tempClient.shutdown();
}
// 构建STS客户端 // 构建STS客户端
DefaultProfile profile = DefaultProfile.getProfile(region, accessKeyId, accessKeySecret); DefaultProfile profile = DefaultProfile.getProfile(region, accessKeyId, accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile); IAcsClient client = new DefaultAcsClient(profile);
...@@ -129,8 +120,8 @@ public class ApiOssStsServiceImpl implements ApiOssStsService { ...@@ -129,8 +120,8 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
tokenResponse.setEndpoint(endpoint); tokenResponse.setEndpoint(endpoint);
tokenResponse.setMaxSize(maxSize); tokenResponse.setMaxSize(maxSize);
//获取分片文件路径的前缀 // 获取分片文件路径的前缀
String filePrefix = ossUtils.getShardFilePrefix(projectBizId,""); String filePrefix = ossUtils.getShardFilePrefix(projectBizId, "");
tokenResponse.setFilePrefix(filePrefix); tokenResponse.setFilePrefix(filePrefix);
return Result.success(tokenResponse); return Result.success(tokenResponse);
} catch (ClientException e) { } catch (ClientException e) {
...@@ -140,19 +131,23 @@ public class ApiOssStsServiceImpl implements ApiOssStsService { ...@@ -140,19 +131,23 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
} }
/** /**
* 批量保存文件列表 * 批量保存文件列表(仅保存元数据,不涉及OSS操作)
* *
* @return * @param request 批量保存请求
* @return 保存结果
*/ */
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Result<ApiBatchSaveFilesResponse> batchSaveFiles(ApiBatchSaveFilesRequest request) { public Result<ApiBatchSaveFilesResponse> batchSaveFiles(ApiBatchSaveFilesRequest request) {
// 根据 projectBizId 切换服务商,获取当前服务商信息 // 根据 projectBizId 获取服务商信息(用于填充providerBizId和bucketName)
ossService.switchProviderByProjectId(request.getProjectBizId()); OssProvider provider = ossProviderService.getProviderByProjectId(request.getProjectBizId());
OssProvider currentProvider = ossService.getCurrentProvider(); if (provider == null) {
String providerBizId = currentProvider.getProviderBizId(); log.error("批量保存文件时未找到服务商配置,projectBizId={}", request.getProjectBizId());
String bucketName = currentProvider.getBucketName(); return Result.fail("未找到对应的OSS服务商配置");
}
String providerBizId = provider.getProviderBizId();
String bucketName = provider.getBucketName();
// 获取当前登录用户信息 // 获取当前登录用户信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser(); AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
...@@ -227,7 +222,7 @@ public class ApiOssStsServiceImpl implements ApiOssStsService { ...@@ -227,7 +222,7 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
} }
} }
// 批量保存(修复条件判断:列表不为空时才保存) // 批量保存
if (CollectionUtils.isNotEmpty(saveOssFileList)) { if (CollectionUtils.isNotEmpty(saveOssFileList)) {
iOssFileService.saveOrUpdateBatch(saveOssFileList); iOssFileService.saveOrUpdateBatch(saveOssFileList);
// 构建响应 // 构建响应
......
...@@ -27,5 +27,5 @@ public class ApiOssExportAppointmentExcelRequest { ...@@ -27,5 +27,5 @@ public class ApiOssExportAppointmentExcelRequest {
/** /**
* 项目ID * 项目ID
*/ */
private String projectBizId = "project_nKULQBH1Gw9Ma8YM"; private String projectBizId;
} }
package com.yd.oss.service.config; //package com.yd.oss.service.config;
//
import com.aliyun.oss.OSS; //import com.aliyun.oss.OSS;
import com.yd.oss.service.service.OssService; //import com.yd.oss.service.service.OssService;
//
import java.lang.reflect.InvocationHandler; //import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; //import java.lang.reflect.Method;
import java.lang.reflect.Proxy; //import java.lang.reflect.Proxy;
//
public class DynamicOssClientProxy implements InvocationHandler { //public class DynamicOssClientProxy implements InvocationHandler {
private final OssService ossService; // private final OssService ossService;
//
public DynamicOssClientProxy(OssService ossService) { // public DynamicOssClientProxy(OssService ossService) {
this.ossService = ossService; // this.ossService = ossService;
} // }
//
public static OSS createProxy(OssService ossService) { // public static OSS createProxy(OssService ossService) {
return (OSS) Proxy.newProxyInstance( // return (OSS) Proxy.newProxyInstance(
DynamicOssClientProxy.class.getClassLoader(), // DynamicOssClientProxy.class.getClassLoader(),
new Class[]{OSS.class}, // new Class[]{OSS.class},
new DynamicOssClientProxy(ossService) // new DynamicOssClientProxy(ossService)
); // );
} // }
//
@Override // @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 每次方法调用都从 OssService 获取当前客户端 // // 每次方法调用都从 OssService 获取当前客户端
OSS currentClient = ossService.getOssClient(); // OSS currentClient = ossService.getOssClient();
return method.invoke(currentClient, args); // return method.invoke(currentClient, args);
} // }
} //}
\ No newline at end of file \ No newline at end of file
package com.yd.oss.service.config;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.service.IOssProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class OssClientFactory {
@Autowired
private IOssProviderService ossProviderService;
/**
* 根据服务商业务ID创建临时OSS客户端
* @param providerBizId 服务商业务ID
* @return OSS客户端(使用后必须调用shutdown())
*/
public OSS createOssClient(String providerBizId) {
OssProvider provider = ossProviderService.getProviderByBizId(providerBizId);
return new OSSClientBuilder().build(
provider.getEndpoint(),
provider.getAccessKey(),
provider.getSecretKey()
);
}
/**
* 根据项目ID创建临时OSS客户端
* @param projectBizId 项目业务ID
* @return OSS客户端(使用后必须调用shutdown())
*/
public OSS createOssClientByProject(String projectBizId) {
OssProvider provider = ossProviderService.getProviderByProjectId(projectBizId);
return new OSSClientBuilder().build(
provider.getEndpoint(),
provider.getAccessKey(),
provider.getSecretKey()
);
}
/**
* 直接根据OssProvider对象创建客户端(如果调用者已持有provider)
*/
public OSS createOssClient(OssProvider provider) {
return new OSSClientBuilder().build(
provider.getEndpoint(),
provider.getAccessKey(),
provider.getSecretKey()
);
}
}
\ No newline at end of file
...@@ -39,22 +39,22 @@ public class OssConfig { ...@@ -39,22 +39,22 @@ public class OssConfig {
} }
} }
// @Bean
// @Primary
// public OSS ossClient() {
// return new OSSClientBuilder().build(
// currentProvider.getEndpoint(),
// currentProvider.getAccessKey(),
// currentProvider.getSecretKey()
// );
// }
@Bean @Bean
public OSS ossClient(OssService ossService) { @Primary
// 返回动态代理,每次调用都委托给 ossService.getOssClient() public OSS ossClient() {
return DynamicOssClientProxy.createProxy(ossService); return new OSSClientBuilder().build(
currentProvider.getEndpoint(),
currentProvider.getAccessKey(),
currentProvider.getSecretKey()
);
} }
// @Bean
// public OSS ossClient(OssService ossService) {
// // 返回动态代理,每次调用都委托给 ossService.getOssClient()
// return DynamicOssClientProxy.createProxy(ossService);
// }
@Bean @Bean
public String defaultBucket() { public String defaultBucket() {
return defaultBucket; return defaultBucket;
......
...@@ -6,5 +6,6 @@ public interface AppointmentExcelService { ...@@ -6,5 +6,6 @@ public interface AppointmentExcelService {
String exportAppointment(Map<String, Object> data, String exportAppointment(Map<String, Object> data,
String templateType, String templateType,
String appointmentBizId); String appointmentBizId,
String projectBizId);
} }
...@@ -40,7 +40,7 @@ public class AppointmentExcelServiceImpl implements AppointmentExcelService { ...@@ -40,7 +40,7 @@ public class AppointmentExcelServiceImpl implements AppointmentExcelService {
* @param fileName * @param fileName
* @return * @return
*/ */
public String exportAndUploadToOss(Map<String, Object> data, String ossObjectKey, String fileName) { public String exportAndUploadToOss(Map<String, Object> data, String ossObjectKey, String fileName,String projectBizId) {
File tempFile = null; File tempFile = null;
File processedFile = null; File processedFile = null;
...@@ -301,12 +301,13 @@ public class AppointmentExcelServiceImpl implements AppointmentExcelService { ...@@ -301,12 +301,13 @@ public class AppointmentExcelServiceImpl implements AppointmentExcelService {
@Override @Override
public String exportAppointment(Map<String, Object> data, public String exportAppointment(Map<String, Object> data,
String templateType, String templateType,
String appointmentBizId) { String appointmentBizId,
String projectBizId) {
// 获取模板信息 // 获取模板信息
FileProdDto fileProdDto = iFileTemplateService.getFileProd("", templateType); FileProdDto fileProdDto = iFileTemplateService.getFileProd("", templateType);
// 生成文件名 // 生成文件名
String fileName = "预约信息_" + appointmentBizId + "_" + System.currentTimeMillis() + ".xlsx"; String fileName = "预约信息_" + appointmentBizId + "_" + System.currentTimeMillis() + ".xlsx";
// 导出并上传到OSS // 导出并上传到OSS
return exportAndUploadToOss(data, fileProdDto.getFileKey(), fileName); return exportAndUploadToOss(data, fileProdDto.getFileKey(), fileName,projectBizId);
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment