refactor(order): 重构重复购买检查策略

- 移除SetIdDuplicateChecker和VideoIdDuplicateChecker两个具体策略类
- 更新DuplicateCheckStrategy枚举,将CHECK_BY_SET_ID和CHECK_BY_VIDEO_ID
  替换为更通用的UNIQUE_RESOURCE和PARENT_RESOURCE策略
- 修改ProductTypeCapabilityManagementServiceImpl中的策略分配逻辑
- UNIQUE_RESOURCE适用于照片、视频等独立资源的重复购买检查
- PARENT_RESOURCE适用于套餐类商品的重复购买检查
- 打印类商品现在正确设置为允许重复购买且不检查
- 其他类别商品默认设置为不检查重复购买
This commit is contained in:
2025-11-28 00:54:54 +08:00
parent 4244b42d4b
commit e292a0798d
5 changed files with 76 additions and 43 deletions

View File

@@ -13,16 +13,27 @@ public enum DuplicateCheckStrategy {
NO_CHECK("NO_CHECK", "不检查"),
/**
* 按视频ID检查(VLOG_VIDEO)
* 同一个视频不允许重复购买
* 检查唯一资源
* 检查用户是否已购买过相同的独立资源
* 查询逻辑:WHERE product_type = ? AND product_id = ?
*
* 适用商品:
* - VLOG_VIDEO:检查是否购买过同一个视频
* - PHOTO:检查是否购买过同一张照片
* - 未来的VIDEO片段:检查是否购买过同一段视频
*/
CHECK_BY_VIDEO_ID("CHECK_BY_VIDEO_ID", "按视频ID检查"),
UNIQUE_RESOURCE("UNIQUE_RESOURCE", "唯一资源检查"),
/**
* 按套餐ID检查(RECORDING_SET, PHOTO_SET)
* 同一个套餐不允许重复购买
* 检查父资源/套餐
* 检查用户是否已购买过该类型的任何商品
* 查询逻辑:WHERE product_type = ?
*
* 适用商品:
* - RECORDING_SET:购买过任意录像集后不能再购买
* - PHOTO_SET:购买过任意照片集后不能再购买
*/
CHECK_BY_SET_ID("CHECK_BY_SET_ID", "按套餐ID检查"),
PARENT_RESOURCE("PARENT_RESOURCE", "父资源检查"),
/**
* 自定义策略(通过扩展实现)

View File

@@ -229,17 +229,33 @@ public class ProductTypeCapabilityManagementServiceImpl implements IProductTypeC
capability.setDisplayName(productType.getDescription());
capability.setCategory(productType.getCategoryCode());
// 根据分类设置默认的定价模式
// 根据分类设置默认的定价模式和去重策略
if (ProductCategory.PRINT == productType.getCategory()) {
// 打印类:基于数量定价,允许重复购买
capability.setPricingMode(PricingMode.QUANTITY_BASED.getCode());
capability.setSupportsTierPricing(true);
capability.setAllowDuplicatePurchase(true);
capability.setDuplicateCheckStrategy(DuplicateCheckStrategy.NO_CHECK.getCode());
} else {
} else if (ProductCategory.PHOTO == productType.getCategory()
|| ProductCategory.VIDEO == productType.getCategory()
|| ProductCategory.VLOG == productType.getCategory()) {
// 照片类、视频类、Vlog类:固定价格,检查唯一资源
capability.setPricingMode(PricingMode.FIXED.getCode());
capability.setSupportsTierPricing(false);
capability.setAllowDuplicatePurchase(false);
capability.setDuplicateCheckStrategy(DuplicateCheckStrategy.CHECK_BY_SET_ID.getCode());
// 判断是套餐类还是独立资源类
if (productType.getCode().endsWith("_SET")) {
capability.setDuplicateCheckStrategy(DuplicateCheckStrategy.PARENT_RESOURCE.getCode());
} else {
capability.setDuplicateCheckStrategy(DuplicateCheckStrategy.UNIQUE_RESOURCE.getCode());
}
} else {
// 其他类:默认不检查
capability.setPricingMode(PricingMode.FIXED.getCode());
capability.setSupportsTierPricing(false);
capability.setAllowDuplicatePurchase(true);
capability.setDuplicateCheckStrategy(DuplicateCheckStrategy.NO_CHECK.getCode());
}
// 优惠能力默认全部开启