refactor(pricing): 重构适用商品类型处理逻辑

- 移除 ProductTypeListTypeHandler,直接在实体类中处理 JSON转换
- 为 PriceVoucherBatchConfig 添加 ObjectMapper 静态实例和日志记录
- 实现 JSON 字符串与 ProductType 列表之间的转换方法- 更新数据库映射,将 applicableProducts 映射为 JSON 字符串
- 优化 VoucherServiceImpl 中的产品适用性检查逻辑
This commit is contained in:
2025-08-30 15:55:26 +08:00
parent 966568156c
commit 047feec045
3 changed files with 88 additions and 7 deletions

View File

@@ -4,9 +4,12 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ycwl.basic.pricing.enums.ProductType;
import com.ycwl.basic.pricing.handler.ProductTypeListTypeHandler;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
import java.util.Date;
@@ -16,9 +19,12 @@ import java.util.List;
* 券码批次配置实体
*/
@Data
@Slf4j
@TableName("price_voucher_batch_config")
public class PriceVoucherBatchConfig {
private static final ObjectMapper objectMapper = new ObjectMapper();
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@@ -48,10 +54,16 @@ public class PriceVoucherBatchConfig {
private BigDecimal discountValue;
/**
* 适用商品类型列表(JSON数组
* 适用商品类型列表(JSON字符串,数据库字段
*/
@TableField("applicable_products")
private String applicableProductsJson;
/**
* 适用商品类型列表(业务字段)
* null表示适用所有商品类型
*/
@TableField(typeHandler = ProductTypeListTypeHandler.class)
@TableField(exist = false)
private List<ProductType> applicableProducts;
/**
@@ -87,4 +99,73 @@ public class PriceVoucherBatchConfig {
private Integer deleted;
private Date deletedAt;
/**
* 获取适用商品类型列表
*/
public List<ProductType> getApplicableProducts() {
if (this.applicableProducts == null && this.applicableProductsJson != null) {
this.applicableProducts = parseApplicableProductsFromJson(this.applicableProductsJson);
}
return this.applicableProducts;
}
/**
* 设置适用商品类型列表
*/
public void setApplicableProducts(List<ProductType> applicableProducts) {
this.applicableProducts = applicableProducts;
this.applicableProductsJson = convertApplicableProductsToJson(applicableProducts);
}
/**
* 从JSON字符串解析商品类型列表
*/
private List<ProductType> parseApplicableProductsFromJson(String json) {
if (json == null || json.trim().isEmpty()) {
return null;
}
try {
TypeReference<List<String>> typeReference = new TypeReference<List<String>>() {};
List<String> codeList = objectMapper.readValue(json, typeReference);
if (codeList == null || codeList.isEmpty()) {
return null;
}
return codeList.stream()
.map(code -> {
try {
return ProductType.fromCode(code);
} catch (IllegalArgumentException e) {
log.warn("未知的商品类型代码: {}", code);
return null;
}
})
.filter(type -> type != null)
.collect(java.util.stream.Collectors.toList());
} catch (JsonProcessingException e) {
log.error("解析适用商品类型JSON失败,JSON: {}", json, e);
return null;
}
}
/**
* 将商品类型列表转换为JSON字符串
*/
private String convertApplicableProductsToJson(List<ProductType> products) {
if (products == null || products.isEmpty()) {
return null;
}
try {
List<String> codeList = products.stream()
.map(ProductType::getCode)
.collect(java.util.stream.Collectors.toList());
return objectMapper.writeValueAsString(codeList);
} catch (JsonProcessingException e) {
log.error("转换适用商品类型为JSON失败", e);
return null;
}
}
}

View File

@@ -293,8 +293,7 @@ public class VoucherServiceImpl implements IVoucherService {
return products.stream()
.filter(product -> {
try {
ProductType productType = ProductType.fromCode(product.getProductType());
return applicableProducts.contains(productType);
return applicableProducts.contains(product.getProductType());
} catch (IllegalArgumentException e) {
log.warn("未知的商品类型: {}", product.getProductType());
return false;

View File

@@ -10,6 +10,7 @@
<result column="broker_id" property="brokerId" />
<result column="discount_type" property="discountType" />
<result column="discount_value" property="discountValue" />
<result column="applicable_products" property="applicableProductsJson" />
<result column="total_count" property="totalCount" />
<result column="used_count" property="usedCount" />
<result column="claimed_count" property="claimedCount" />
@@ -24,7 +25,7 @@
<!-- 基础字段 -->
<sql id="Base_Column_List">
id, batch_name, scenic_id, broker_id, discount_type, discount_value,
id, batch_name, scenic_id, broker_id, discount_type, discount_value, applicable_products,
total_count, used_count, claimed_count, status, create_time, update_time,
create_by, update_by, deleted, deleted_at
</sql>
@@ -71,7 +72,7 @@
<!-- 根据券码查询对应的券码批次配置 -->
<select id="selectByVoucherCode" resultMap="BaseResultMap">
SELECT
b.id, b.batch_name, b.scenic_id, b.broker_id, b.discount_type, b.discount_value,
b.id, b.batch_name, b.scenic_id, b.broker_id, b.discount_type, b.discount_value, b.applicable_products,
b.total_count, b.used_count, b.claimed_count, b.status, b.create_time, b.update_time,
b.create_by, b.update_by, b.deleted, b.deleted_at
FROM price_voucher_batch_config b