refactor(config): 重构配置管理并优化翻译功能

- 移除 @Component 注解,改用 @EnableConfigurationProperties 在启动类中启用配置
- 将PingPong支付配置从主配置文件移至开发环境配置文件
- 添加PayPal支付配置和百度翻译配置到开发环境
- 将商品和SKU名称翻译逻辑从查询时移至创建时,提高性能
- 移除运行时翻译方法,改为数据库中存储已翻译内容
- 标记PaymentController为过时,系统已切换到PayPal支付
- 优化pom.xml配置,添加classifier属性
This commit is contained in:
2025-12-24 17:39:36 +08:00
parent 425c46217e
commit 0f2f5c8630
10 changed files with 133 additions and 172 deletions

View File

@@ -2,13 +2,12 @@ package com.mtkj.mtpay.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 阿里云OSS配置属性
* 注意:不使用 @Component而是通过 @EnableConfigurationProperties 在启动类中启用
*/
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliyunOSSProperties {

View File

@@ -2,13 +2,12 @@ package com.mtkj.mtpay.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* PingPong支付配置属性
* 注意:不使用 @Component而是通过 @EnableConfigurationProperties 在启动类中启用
*/
@Data
@Component
@ConfigurationProperties(prefix = "pingpong")
public class PingPongProperties {

View File

@@ -16,11 +16,15 @@ import java.util.Map;
import java.util.Optional;
/**
* 支付控制器
* 支付控制器PingPong支付
*
* @deprecated 系统已切换到 PayPal 支付,此控制器保留以备将来需要时使用
* 如需重新启用,请取消注释 @RestController 和 @RequestMapping 注解
*/
@Deprecated
@Slf4j
@RestController
@RequestMapping("/api/payment")
// @RestController
// @RequestMapping("/api/payment")
@RequiredArgsConstructor
public class PaymentController {

View File

@@ -71,8 +71,30 @@ public class CustomerOrderServiceImpl implements CustomerOrderService {
CustomerOrder order = new CustomerOrder();
order.setOrderNo(OrderIdGenerator.generateMerchantTransactionId());
order.setProductId(request.getProductId());
order.setProductName(product.getName());
// 根据SKU的货币代码翻译商品名称并存入订单表
String currency = sku.getCurrency();
String translatedProductName = product.getName(); // 默认使用原始名称
if (currency != null && !currency.trim().isEmpty()) {
try {
String targetLanguage = baiduTranslatorUtils.getLanguageByCurrency(currency);
log.debug("订单货币: {}, 推断目标语言: {}, 原始商品名称: {}",
currency, targetLanguage, product.getName());
String translated = baiduTranslatorUtils.getTransResult(product.getName(), targetLanguage);
if (translated != null && !translated.equals(product.getName())) {
translatedProductName = translated;
log.info("商品名称翻译: {} -> {} (货币: {}, 语言: {})",
product.getName(), translatedProductName, currency, targetLanguage);
}
} catch (Exception e) {
log.warn("翻译商品名称失败使用原始名称商品ID: {}, 货币: {}",
request.getProductId(), currency, e);
}
}
order.setProductName(translatedProductName);
order.setSkuId(request.getSkuId());
// SKU名称已在创建商品时翻译并存入数据库直接使用即可
order.setSkuName(sku.getSku());
order.setQuantity(request.getQuantity());
order.setUnitPrice(sku.getPrice());
@@ -161,8 +183,7 @@ public class CustomerOrderServiceImpl implements CustomerOrderService {
// 将JSON特殊字段转换为Map
response.setShippingSpecialFields(order.getShippingSpecialFieldsMap());
// 翻译订单内容(商品名称和SKU名称
translateOrderContent(response);
// 注意:商品名称和SKU名称已在创建时翻译并存入数据库,查询时直接返回即可
return response;
}
@@ -185,8 +206,7 @@ public class CustomerOrderServiceImpl implements CustomerOrderService {
// 将JSON特殊字段转换为Map
response.setShippingSpecialFields(order.getShippingSpecialFieldsMap());
// 翻译订单内容(商品名称和SKU名称
translateOrderContent(response);
// 注意:商品名称和SKU名称已在创建时翻译并存入数据库,查询时直接返回即可
return response;
}
@@ -207,8 +227,7 @@ public class CustomerOrderServiceImpl implements CustomerOrderService {
// 将JSON特殊字段转换为Map
response.setShippingSpecialFields(order.getShippingSpecialFieldsMap());
// 翻译订单内容(商品名称和SKU名称
translateOrderContent(response);
// 注意:商品名称和SKU名称已在创建时翻译并存入数据库,查询时直接返回即可
return response;
}
@@ -288,47 +307,5 @@ public class CustomerOrderServiceImpl implements CustomerOrderService {
log.info("订单状态更新成功,订单号: {}", orderNo);
}
/**
* 翻译订单内容商品名称和SKU名称
* 根据订单的货币代码推断目标语言
*/
private void translateOrderContent(CustomerOrderResponseDTO orderDTO) {
try {
// 如果没有货币信息,不进行翻译
String currency = orderDTO.getCurrency();
if (currency == null || currency.trim().isEmpty()) {
// 尝试使用支付货币
currency = orderDTO.getPaymentCurrency();
if (currency == null || currency.trim().isEmpty()) {
log.debug("订单货币代码为空,跳过翻译,订单号: {}", orderDTO.getOrderNo());
return;
}
}
String targetLanguage = baiduTranslatorUtils.getLanguageByCurrency(currency);
log.debug("根据货币代码 {} 推断目标语言: {}, 订单号: {}", currency, targetLanguage, orderDTO.getOrderNo());
// 翻译商品名称
if (orderDTO.getProductName() != null && !orderDTO.getProductName().trim().isEmpty()) {
String translatedName = baiduTranslatorUtils.getTransResult(orderDTO.getProductName(), targetLanguage);
if (translatedName != null && !translatedName.equals(orderDTO.getProductName())) {
log.debug("商品名称翻译: {} -> {}, 订单号: {}", orderDTO.getProductName(), translatedName, orderDTO.getOrderNo());
orderDTO.setProductName(translatedName);
}
}
// 翻译SKU名称
if (orderDTO.getSkuName() != null && !orderDTO.getSkuName().trim().isEmpty()) {
String translatedSku = baiduTranslatorUtils.getTransResult(orderDTO.getSkuName(), targetLanguage);
if (translatedSku != null && !translatedSku.equals(orderDTO.getSkuName())) {
log.debug("SKU名称翻译: {} -> {}, 订单号: {}", orderDTO.getSkuName(), translatedSku, orderDTO.getOrderNo());
orderDTO.setSkuName(translatedSku);
}
}
} catch (Exception e) {
log.error("翻译订单内容失败,订单号: {}", orderDTO.getOrderNo(), e);
// 翻译失败不影响订单数据返回,只记录日志
}
}
}

View File

@@ -70,6 +70,7 @@ public class ProductServiceImpl implements ProductService {
// 创建商品
MtProduct product = new MtProduct();
// 商品名称存储原始名称(不翻译,因为一个商品可能对应多个国家/货币)
product.setName(request.getName());
product.setPrice(request.getPrice());
@@ -102,13 +103,34 @@ public class ProductServiceImpl implements ProductService {
}
log.debug("商品基础信息插入成功商品ID: {}", product.getId());
// 创建SKU
// 创建SKU(在存入数据库前完成翻译)
if (request.getSkus() != null && !request.getSkus().isEmpty()) {
log.debug("开始创建SKU数量: {}", request.getSkus().size());
for (CreateProductRequestDTO.CreateProductSkuDTO skuDTO : request.getSkus()) {
MtProductSku sku = new MtProductSku();
sku.setProductId(product.getId());
sku.setSku(skuDTO.getSku());
// 根据SKU的货币代码推断目标语言并翻译SKU名称
String currency = skuDTO.getCurrency();
if (currency != null && !currency.trim().isEmpty()) {
String targetLanguage = baiduTranslatorUtils.getLanguageByCurrency(currency);
log.debug("SKU货币: {}, 推断目标语言: {}, 原始SKU名称: {}",
currency, targetLanguage, skuDTO.getSku());
// 翻译SKU名称
String originalSkuName = skuDTO.getSku();
String translatedSkuName = baiduTranslatorUtils.getTransResult(originalSkuName, targetLanguage);
if (translatedSkuName != null && !translatedSkuName.equals(originalSkuName)) {
log.info("SKU名称翻译: {} -> {} (货币: {}, 语言: {})",
originalSkuName, translatedSkuName, currency, targetLanguage);
sku.setSku(translatedSkuName); // 存储翻译后的名称
} else {
sku.setSku(originalSkuName); // 翻译失败或无需翻译,使用原文
}
} else {
sku.setSku(skuDTO.getSku()); // 无货币信息,使用原文
}
sku.setPrice(skuDTO.getPrice());
sku.setCurrency(skuDTO.getCurrency());
sku.setStock(skuDTO.getStock());
@@ -125,7 +147,7 @@ public class ProductServiceImpl implements ProductService {
throw new BusinessException(ResultCode.SYSTEM_ERROR, "创建SKU失败");
}
log.debug("SKU创建成功商品ID: {}, SKU编码: {}, SKU ID: {}",
product.getId(), skuDTO.getSku(), sku.getId());
product.getId(), sku.getSku(), sku.getId());
}
}
@@ -207,8 +229,8 @@ public class ProductServiceImpl implements ProductService {
response.setSkus(skuDTOs);
// 翻译功能根据SKU的货币代码推断目标语言并翻译
translateProductContent(response);
// 注意商品名称和SKU名称已在创建时翻译并存入数据库查询时直接返回即可
// 如果需要根据当前用户的语言再次翻译,可以在这里添加逻辑
log.info("获取商品详情成功商品ID: {}, 商品名称: {}, SKU数量: {}, 主图数量: {}",
id, product.getName(), skuDTOs.size(),
@@ -314,8 +336,7 @@ public class ProductServiceImpl implements ProductService {
}).collect(Collectors.toList());
dto.setSkus(skuDTOs);
// 翻译功能根据SKU的货币代码推断目标语言并翻译
translateProductContent(dto);
// 注意商品名称和SKU名称已在创建时翻译并存入数据库查询时直接返回即可
result.add(dto);
}
@@ -324,58 +345,5 @@ public class ProductServiceImpl implements ProductService {
return result;
}
/**
* 翻译商品内容商品名称和SKU名称
* 根据SKU的货币代码推断目标语言
*/
private void translateProductContent(ProductResponseDTO productDTO) {
try {
// 如果没有SKU不进行翻译
if (productDTO.getSkus() == null || productDTO.getSkus().isEmpty()) {
return;
}
// 根据第一个SKU的货币代码推断目标语言
String firstCurrency = productDTO.getSkus().get(0).getCurrency();
if (firstCurrency == null || firstCurrency.trim().isEmpty()) {
log.debug("SKU货币代码为空跳过翻译商品ID: {}", productDTO.getId());
return;
}
String targetLanguage = baiduTranslatorUtils.getLanguageByCurrency(firstCurrency);
log.debug("根据货币代码 {} 推断目标语言: {}, 商品ID: {}", firstCurrency, targetLanguage, productDTO.getId());
// 翻译商品名称
if (productDTO.getName() != null && !productDTO.getName().trim().isEmpty()) {
String translatedName = baiduTranslatorUtils.getTransResult(productDTO.getName(), targetLanguage);
if (translatedName != null && !translatedName.equals(productDTO.getName())) {
log.debug("商品名称翻译: {} -> {}, 商品ID: {}", productDTO.getName(), translatedName, productDTO.getId());
productDTO.setName(translatedName);
}
}
// 翻译每个SKU的名称sku字段
for (ProductResponseDTO.ProductSkuResponseDTO skuDTO : productDTO.getSkus()) {
// 如果SKU的货币与第一个不同使用该SKU的货币推断语言
String skuCurrency = skuDTO.getCurrency();
String skuLanguage = targetLanguage;
if (skuCurrency != null && !skuCurrency.equals(firstCurrency)) {
skuLanguage = baiduTranslatorUtils.getLanguageByCurrency(skuCurrency);
}
// 翻译SKU名称
if (skuDTO.getSku() != null && !skuDTO.getSku().trim().isEmpty()) {
String translatedSku = baiduTranslatorUtils.getTransResult(skuDTO.getSku(), skuLanguage);
if (translatedSku != null && !translatedSku.equals(skuDTO.getSku())) {
log.debug("SKU名称翻译: {} -> {}, SKU ID: {}", skuDTO.getSku(), translatedSku, skuDTO.getId());
skuDTO.setSku(translatedSku);
}
}
}
} catch (Exception e) {
log.error("翻译商品内容失败商品ID: {}", productDTO.getId(), e);
// 翻译失败不影响商品数据返回,只记录日志
}
}
}