You've already forked FrameTour-BE
feat(pricing): 新增打包购买优惠功能
- 添加打包购买优惠信息类 BundleDiscountInfo - 实现打包购买优惠提供者 BundleDiscountProvider - 添加打包购买优惠服务接口 IBundleDiscountService 及其实现类 BundleDiscountServiceImpl - 在 DiscountInfo 中添加 bundleDiscountInfo 字段以支持打包优惠 - 更新 CLAUDE.md 文档,详细说明打包购买优惠系统的设计和实现
This commit is contained in:
@@ -25,6 +25,7 @@ com.ycwl.basic.pricing/
|
||||
│ │ DiscountResult.java, DiscountCombinationResult.java
|
||||
│ ├── BundleProductItem.java, MobilePriceCalculationRequest.java
|
||||
│ ├── OnePriceConfigRequest.java, OnePriceInfo.java
|
||||
│ ├── BundleDiscountInfo.java # 打包购买优惠信息
|
||||
│ ├── req/ # 券码管理请求DTO
|
||||
│ │ ├── VoucherBatchCreateReq(.java|V2)
|
||||
│ │ ├── VoucherBatchQueryReq.java, VoucherCodeQueryReq.java, VoucherClaimReq.java
|
||||
@@ -58,6 +59,7 @@ com.ycwl.basic.pricing/
|
||||
│ └── PriceOnePriceConfigMapper.java, VoucherPrintRecordMapper.java
|
||||
└── service/ # 业务层接口与实现
|
||||
├── IPriceCalculationService.java, IDiscountDetectionService.java, IDiscountProvider.java
|
||||
├── IBundleDiscountService.java # 打包购买优惠服务接口
|
||||
├── IProductConfigService.java, IPricingManagementService.java, IPriceBundleService.java
|
||||
├── ICouponService.java, ICouponManagementService.java
|
||||
├── IOnePricePurchaseService.java, IVoucherService.java, IVoucherUsageService.java
|
||||
@@ -69,7 +71,8 @@ com.ycwl.basic.pricing/
|
||||
├── VoucherServiceImpl.java, VoucherDiscountProvider.java,
|
||||
├── VoucherBatchServiceImpl.java, VoucherCodeServiceImpl.java, VoucherPrintServiceImpl.java,
|
||||
├── VoucherUsageServiceImpl.java,
|
||||
└── OnePricePurchaseServiceImpl.java, OnePricePurchaseDiscountProvider.java
|
||||
├── OnePricePurchaseServiceImpl.java, OnePricePurchaseDiscountProvider.java
|
||||
└── BundleDiscountServiceImpl.java, BundleDiscountProvider.java # 打包购买优惠实现
|
||||
```
|
||||
|
||||
## 核心功能
|
||||
@@ -333,30 +336,37 @@ public interface IDiscountDetectionService {
|
||||
|
||||
### 2. 优惠提供者实现(当前实现与优先级)
|
||||
|
||||
#### VoucherDiscountProvider (优先级: 100)
|
||||
#### OnePricePurchaseDiscountProvider (优先级: 120)
|
||||
- 处理一口价优惠逻辑(景区级统一价格)
|
||||
- **最高优先级**,优先于所有其他优惠类型
|
||||
- 仅当一口价小于当前金额时产生优惠;是否可与券码/优惠券叠加由配置 `canUseCoupon/canUseVoucher` 决定
|
||||
|
||||
#### BundleDiscountProvider (优先级: 100)
|
||||
- 处理打包购买优惠逻辑(多商品组合优惠)
|
||||
- 支持多种优惠类型:固定减免、百分比折扣、固定价格
|
||||
- 可配置叠加规则(与优惠券、券码、一口价的组合限制)
|
||||
- 自动检测购物车中符合条件的商品组合
|
||||
|
||||
#### VoucherDiscountProvider (优先级: 80)
|
||||
- 处理券码优惠逻辑
|
||||
- 支持用户主动输入券码或自动选择最优券码
|
||||
- 全场免费券码不可与其他优惠叠加
|
||||
|
||||
#### CouponDiscountProvider (优先级: 80)
|
||||
#### CouponDiscountProvider (优先级: 60)
|
||||
- 处理优惠券优惠逻辑
|
||||
- **最低优先级**,在所有其他优惠之后应用
|
||||
- 自动选择最优优惠券
|
||||
- 可与券码叠加使用(除全场免费券码外)
|
||||
|
||||
#### OnePricePurchaseDiscountProvider (优先级: 60)
|
||||
- 处理一口价优惠逻辑(景区级统一价格)
|
||||
- 仅当一口价小于当前金额时产生优惠;是否可与券码/优惠券叠加由配置 `canUseCoupon/canUseVoucher` 决定
|
||||
|
||||
### 3. 优惠应用策略
|
||||
|
||||
#### 优先级规则
|
||||
```
|
||||
券码 (100) → 优惠券 (80) → 一口价 (60)
|
||||
一口价 (120) → 打包购买 (100) → 券码 (80) → 优惠券 (60)
|
||||
```
|
||||
|
||||
#### 叠加逻辑
|
||||
```java
|
||||
原价 → 券码 → 优惠券 → 一口价 → 最终价格
|
||||
原价 → 一口价 → 打包购买 → 券码 → 优惠券 → 最终价格
|
||||
|
||||
特殊情况:
|
||||
- 全场免费券码:直接最终价=0,停止后续优惠
|
||||
@@ -385,6 +395,88 @@ public class FlashSaleDiscountProvider implements IDiscountProvider {
|
||||
// 按优先级排序并注册到 DiscountDetectionService 中
|
||||
```
|
||||
|
||||
## 打包购买优惠系统 (Bundle Discount System)
|
||||
|
||||
### 1. 核心特性
|
||||
|
||||
打包购买优惠系统是新增的优惠类型,支持多商品组合优惠策略,具有第二高优先级(仅次于一口价)。
|
||||
|
||||
#### 优惠类型支持
|
||||
- **FIXED_DISCOUNT**: 固定减免金额(如满2件减50元)
|
||||
- **PERCENTAGE_DISCOUNT**: 百分比折扣(如多商品组合9折)
|
||||
- **FIXED_PRICE**: 固定套餐价格(如照片+视频套餐199元)
|
||||
|
||||
#### 触发条件
|
||||
- **商品数量要求**: 最低购买数量限制
|
||||
- **商品金额要求**: 最低购买金额限制
|
||||
- **商品类型组合**: 特定商品类型的组合(如照片+视频)
|
||||
|
||||
### 2. 业务规则
|
||||
|
||||
#### 自动检测规则
|
||||
```java
|
||||
// 多商品类型组合优惠
|
||||
- 条件:购买不同类型商品 >= 2种
|
||||
- 优惠:9折优惠
|
||||
- 可叠加:可与优惠券、券码叠加,不可与一口价叠加
|
||||
|
||||
// 大批量购买优惠
|
||||
- 条件:总数量 >= 10件 且 总金额 >= 500元
|
||||
- 优惠:减免50元
|
||||
- 可叠加:可与优惠券、券码叠加,不可与一口价叠加
|
||||
|
||||
// 特定组合套餐
|
||||
- 条件:同时购买照片集和Vlog视频
|
||||
- 优惠:套餐价199元
|
||||
- 可叠加:不可与其他优惠叠加
|
||||
```
|
||||
|
||||
#### 叠加规则配置
|
||||
每个打包优惠规则都可以独立配置与其他优惠的叠加关系:
|
||||
- `canUseWithCoupon`: 是否可与优惠券叠加
|
||||
- `canUseWithVoucher`: 是否可与券码叠加
|
||||
- `canUseWithOnePrice`: 是否可与一口价叠加
|
||||
|
||||
### 3. 核心接口
|
||||
|
||||
#### IBundleDiscountService
|
||||
```java
|
||||
// 检测可用的打包优惠
|
||||
List<BundleDiscountInfo> detectAvailableBundleDiscounts(DiscountDetectionContext context);
|
||||
|
||||
// 计算打包优惠金额
|
||||
BigDecimal calculateBundleDiscount(BundleDiscountInfo bundleDiscount, List<ProductItem> products);
|
||||
|
||||
// 获取最优的打包优惠组合
|
||||
BundleDiscountInfo getBestBundleDiscount(List<ProductItem> products, Long scenicId);
|
||||
```
|
||||
|
||||
#### BundleDiscountProvider
|
||||
- 实现 `IDiscountProvider` 接口
|
||||
- 优先级:100(第二高,仅次于一口价的120)
|
||||
- 自动集成到统一优惠检测系统
|
||||
|
||||
### 4. 扩展开发
|
||||
|
||||
#### 添加新的打包规则
|
||||
```java
|
||||
// 在 BundleDiscountServiceImpl 中添加新规则
|
||||
private BundleDiscountInfo createNewBundleRule() {
|
||||
BundleDiscountInfo bundle = new BundleDiscountInfo();
|
||||
bundle.setBundleConfigId(4L);
|
||||
bundle.setBundleName("新打包规则");
|
||||
bundle.setDiscountType("PERCENTAGE_DISCOUNT");
|
||||
bundle.setDiscountValue(new BigDecimal("0.85")); // 8.5折
|
||||
bundle.setMinQuantity(5);
|
||||
bundle.setMinAmount(new BigDecimal("300"));
|
||||
// 配置叠加规则...
|
||||
return bundle;
|
||||
}
|
||||
```
|
||||
|
||||
#### 数据库配置支持
|
||||
后续可以扩展为从数据库加载打包规则配置,替换当前的硬编码规则。
|
||||
|
||||
## API 接口扩展
|
||||
|
||||
### 1. 价格计算接口扩展
|
||||
|
Reference in New Issue
Block a user