Commit 06cbc20d by zhangxingmin

push

parent 0378b7bd
package com.yd.oss.api.service.impl;
import com.aliyun.oss.OSS;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.oss.api.service.ApiExcelService;
......@@ -10,10 +11,9 @@ import com.yd.oss.feign.response.ApiOssExportAppointmentExcelResponse;
import com.yd.oss.feign.dto.ExportParam;
import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.feign.result.ImportResult;
import com.yd.oss.service.service.AppointmentExcelService;
import com.yd.oss.service.service.ExcelExportService;
import com.yd.oss.service.service.ExcelImportService;
import com.yd.oss.service.service.ExcelParserService;
import com.yd.oss.service.config.OssClientFactory;
import com.yd.oss.service.model.OssProvider;
import com.yd.oss.service.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -41,6 +41,12 @@ public class ApiExcelServiceImpl implements ApiExcelService {
@Autowired
private ExcelImportService excelImportService;
@Autowired
private OssClientFactory ossClientFactory;
@Autowired
private IOssProviderService ossProviderService;
/**
* 导出excel-预约信息
* @param request
......@@ -49,9 +55,17 @@ public class ApiExcelServiceImpl implements ApiExcelService {
@Override
public Result<ApiOssExportAppointmentExcelResponse> exportAppointment(ApiOssExportAppointmentExcelRequest request) {
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(),
request.getTemplateType(),
request.getAppointmentBizId());
request.getAppointmentBizId(),
request.getProjectBizId());
response.setUrl(url);
return Result.success(response);
}
......
......@@ -13,6 +13,9 @@ import com.yd.common.enums.CommonEnum;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
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.feign.dto.ApiOssFileDto;
import com.yd.oss.feign.request.ApiBatchSaveFilesRequest;
......@@ -20,9 +23,7 @@ import com.yd.oss.feign.response.ApiBatchSaveFilesResponse;
import com.yd.oss.feign.response.ApiGetStsTokenResponse;
import com.yd.oss.feign.response.ApiOssFileResponse;
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.OssService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.io.FilenameUtils;
......@@ -31,6 +32,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.net.MalformedURLException;
import java.net.URL;
import java.time.LocalDateTime;
......@@ -41,34 +43,15 @@ import java.util.List;
@Service
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}")
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
@Value("${aliyun.oss.max-size:104857600}")
private Long maxSize;
@Autowired
private OssService ossService;
// 动态代理的 OSS 客户端,会自动切换到当前服务商
@Autowired
private OSS ossClient;
private IOssProviderService ossProviderService;
@Autowired
private IOssFileService iOssFileService;
......@@ -76,32 +59,40 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
@Autowired
private OssUtils ossUtils;
@Autowired
private OssClientFactory ossClientFactory; // 如果需要执行OSS操作时使用
/**
* getStsToken如何根据传入的projectBizId查询对应服务商然后切换对应OSS服务商
* @param projectBizId
* @return
* 获取STS临时凭证
* @param projectBizId 项目业务ID,用于确定使用的OSS服务商
* @return STS凭证响应
*/
@Override
public Result<ApiGetStsTokenResponse> getStsToken(String projectBizId) {
// 切换服务商
ossService.switchProviderByProjectId(projectBizId);
// 获取切换后的服务商信息
OssProvider currentProvider = ossService.getCurrentProvider();
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);
// 可以创建桶,但通常桶应提前准备好
// 根据项目ID获取服务商信息
OssProvider provider = ossProviderService.getProviderByProjectId(projectBizId);
if (provider == null) {
log.error("未找到项目对应的OSS服务商,projectBizId={}", projectBizId);
return Result.fail("未找到对应的OSS服务商配置");
}
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客户端
DefaultProfile profile = DefaultProfile.getProfile(region, accessKeyId, accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile);
......@@ -129,8 +120,8 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
tokenResponse.setEndpoint(endpoint);
tokenResponse.setMaxSize(maxSize);
//获取分片文件路径的前缀
String filePrefix = ossUtils.getShardFilePrefix(projectBizId,"");
// 获取分片文件路径的前缀
String filePrefix = ossUtils.getShardFilePrefix(projectBizId, "");
tokenResponse.setFilePrefix(filePrefix);
return Result.success(tokenResponse);
} catch (ClientException e) {
......@@ -140,19 +131,23 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
}
/**
* 批量保存文件列表
* 批量保存文件列表(仅保存元数据,不涉及OSS操作)
*
* @return
* @param request 批量保存请求
* @return 保存结果
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Result<ApiBatchSaveFilesResponse> batchSaveFiles(ApiBatchSaveFilesRequest request) {
// 根据 projectBizId 切换服务商,获取当前服务商信息
ossService.switchProviderByProjectId(request.getProjectBizId());
OssProvider currentProvider = ossService.getCurrentProvider();
String providerBizId = currentProvider.getProviderBizId();
String bucketName = currentProvider.getBucketName();
// 根据 projectBizId 获取服务商信息(用于填充providerBizId和bucketName)
OssProvider provider = ossProviderService.getProviderByProjectId(request.getProjectBizId());
if (provider == null) {
log.error("批量保存文件时未找到服务商配置,projectBizId={}", request.getProjectBizId());
return Result.fail("未找到对应的OSS服务商配置");
}
String providerBizId = provider.getProviderBizId();
String bucketName = provider.getBucketName();
// 获取当前登录用户信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
......@@ -227,7 +222,7 @@ public class ApiOssStsServiceImpl implements ApiOssStsService {
}
}
// 批量保存(修复条件判断:列表不为空时才保存)
// 批量保存
if (CollectionUtils.isNotEmpty(saveOssFileList)) {
iOssFileService.saveOrUpdateBatch(saveOssFileList);
// 构建响应
......
......@@ -27,5 +27,5 @@ public class ApiOssExportAppointmentExcelRequest {
/**
* 项目ID
*/
private String projectBizId = "project_nKULQBH1Gw9Ma8YM";
private String projectBizId;
}
package com.yd.oss.service.config;
import com.aliyun.oss.OSS;
import com.yd.oss.service.service.OssService;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class DynamicOssClientProxy implements InvocationHandler {
private final OssService ossService;
public DynamicOssClientProxy(OssService ossService) {
this.ossService = ossService;
}
public static OSS createProxy(OssService ossService) {
return (OSS) Proxy.newProxyInstance(
DynamicOssClientProxy.class.getClassLoader(),
new Class[]{OSS.class},
new DynamicOssClientProxy(ossService)
);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 每次方法调用都从 OssService 获取当前客户端
OSS currentClient = ossService.getOssClient();
return method.invoke(currentClient, args);
}
}
\ No newline at end of file
//package com.yd.oss.service.config;
//
//import com.aliyun.oss.OSS;
//import com.yd.oss.service.service.OssService;
//
//import java.lang.reflect.InvocationHandler;
//import java.lang.reflect.Method;
//import java.lang.reflect.Proxy;
//
//public class DynamicOssClientProxy implements InvocationHandler {
// private final OssService ossService;
//
// public DynamicOssClientProxy(OssService ossService) {
// this.ossService = ossService;
// }
//
// public static OSS createProxy(OssService ossService) {
// return (OSS) Proxy.newProxyInstance(
// DynamicOssClientProxy.class.getClassLoader(),
// new Class[]{OSS.class},
// new DynamicOssClientProxy(ossService)
// );
// }
//
// @Override
// public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// // 每次方法调用都从 OssService 获取当前客户端
// OSS currentClient = ossService.getOssClient();
// return method.invoke(currentClient, args);
// }
//}
\ 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 {
}
}
// @Bean
// @Primary
// public OSS ossClient() {
// return new OSSClientBuilder().build(
// currentProvider.getEndpoint(),
// currentProvider.getAccessKey(),
// currentProvider.getSecretKey()
// );
// }
@Bean
public OSS ossClient(OssService ossService) {
// 返回动态代理,每次调用都委托给 ossService.getOssClient()
return DynamicOssClientProxy.createProxy(ossService);
@Primary
public OSS ossClient() {
return new OSSClientBuilder().build(
currentProvider.getEndpoint(),
currentProvider.getAccessKey(),
currentProvider.getSecretKey()
);
}
// @Bean
// public OSS ossClient(OssService ossService) {
// // 返回动态代理,每次调用都委托给 ossService.getOssClient()
// return DynamicOssClientProxy.createProxy(ossService);
// }
@Bean
public String defaultBucket() {
return defaultBucket;
......
......@@ -6,5 +6,6 @@ public interface AppointmentExcelService {
String exportAppointment(Map<String, Object> data,
String templateType,
String appointmentBizId);
String appointmentBizId,
String projectBizId);
}
......@@ -40,7 +40,7 @@ public class AppointmentExcelServiceImpl implements AppointmentExcelService {
* @param fileName
* @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 processedFile = null;
......@@ -301,12 +301,13 @@ public class AppointmentExcelServiceImpl implements AppointmentExcelService {
@Override
public String exportAppointment(Map<String, Object> data,
String templateType,
String appointmentBizId) {
String appointmentBizId,
String projectBizId) {
// 获取模板信息
FileProdDto fileProdDto = iFileTemplateService.getFileProd("", templateType);
// 生成文件名
String fileName = "预约信息_" + appointmentBizId + "_" + System.currentTimeMillis() + ".xlsx";
// 导出并上传到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