refactor(order): 重构重复购买检查和定价逻辑

- 引入商品类型能力配置,替代硬编码的商品类型判断
- 实现策略模式处理不同商品类型的重复购买检查
- 抽象定价模式,支持固定价格和数量计价等不同方式
- 新增策略工厂自动注册各类检查器实现
- 添加缓存机制提升商品类型配置查询性能
- 解耦订单服务与具体商品类型的紧耦合关系
- 提高代码可维护性和扩展性,便于新增商品类型
This commit is contained in:
2025-11-27 09:34:10 +08:00
parent 1945639f90
commit 3ce3972875
15 changed files with 1062 additions and 139 deletions

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ycwl.basic.product.mapper.ProductTypeCapabilityMapper">
<!-- 结果映射 -->
<resultMap id="BaseResultMap" type="com.ycwl.basic.product.capability.ProductTypeCapability">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="product_type" property="productType" jdbcType="VARCHAR"/>
<result column="display_name" property="displayName" jdbcType="VARCHAR"/>
<result column="category" property="category" jdbcType="VARCHAR"/>
<result column="pricing_mode" property="pricingMode" jdbcType="VARCHAR"/>
<result column="supports_tier_pricing" property="supportsTierPricing" jdbcType="BOOLEAN"/>
<result column="allow_duplicate_purchase" property="allowDuplicatePurchase" jdbcType="BOOLEAN"/>
<result column="duplicate_check_strategy" property="duplicateCheckStrategy" jdbcType="VARCHAR"/>
<result column="can_use_coupon" property="canUseCoupon" jdbcType="BOOLEAN"/>
<result column="can_use_voucher" property="canUseVoucher" jdbcType="BOOLEAN"/>
<result column="can_use_one_price" property="canUseOnePrice" jdbcType="BOOLEAN"/>
<result column="can_use_bundle" property="canUseBundle" jdbcType="BOOLEAN"/>
<result column="metadata" property="metadata" jdbcType="VARCHAR"
typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
<result column="is_active" property="isActive" jdbcType="BOOLEAN"/>
<result column="created_at" property="createdAt" jdbcType="TIMESTAMP"/>
<result column="updated_at" property="updatedAt" jdbcType="TIMESTAMP"/>
</resultMap>
<!-- 基础列 -->
<sql id="Base_Column_List">
id, product_type, display_name, category,
pricing_mode, supports_tier_pricing,
allow_duplicate_purchase, duplicate_check_strategy,
can_use_coupon, can_use_voucher, can_use_one_price, can_use_bundle,
metadata, is_active, created_at, updated_at
</sql>
<!-- 根据商品类型代码查询 -->
<select id="selectByProductType" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM product_type_capability
WHERE product_type = #{productType}
AND is_active = TRUE
LIMIT 1
</select>
</mapper>