# 收藏和好评双重领取场景分析

## 问题描述

有一种优惠券既可以通过收藏领取（`attention_can_received=1`），又可以通过好评赠券。当前逻辑会如何处理这种情况？

## 当前逻辑分析

### 1. 收藏店铺发放逻辑

**位置**：`LifeDiscountCouponServiceImpl.issueCouponsForStoreCollect`

**检查逻辑**：
```java
// 查询用户已领取的该店铺所有优惠券（不限制领取来源）
// 通过优惠券类型判断，如果用户已领取过某类型的优惠券（无论通过什么方式），不再发放
```

**特点**：
- ✅ 检查所有领取来源（包括好评送券、好友赠送等）
- ✅ 按优惠券类型判断，避免重复发放
- ✅ 如果用户已通过任何方式领取过该类型，收藏时不会发放

### 2. 好评送券逻辑

**位置**：`LifeDiscountCouponStoreFriendServiceImpl.issueCouponForGoodRating`

**检查逻辑**：
```java
// 直接发放优惠券，不检查用户是否已领取过
// 只检查库存和活动参与次数限制
```

**特点**：
- ❌ 不检查用户是否已领取过该优惠券
- ❌ 不检查用户是否已领取过该类型的优惠券
- ✅ 只检查库存和活动参与次数限制

## 场景分析

### 场景1：先收藏后好评

**流程**：
1. 用户收藏店铺 → 领取类型1的优惠券（`issueSource=2`）
2. 用户给店铺好评 → 系统尝试发放类型1的优惠券（`issueSource=3`）

**当前处理**：
- ✅ 收藏时：正常发放类型1的优惠券
- ❌ 好评时：**会重复发放**类型1的优惠券（因为好评送券不检查是否已领取）

**结果**：用户会获得2张类型1的优惠券

### 场景2：先好评后收藏

**流程**：
1. 用户给店铺好评 → 领取类型1的优惠券（`issueSource=3`）
2. 用户收藏店铺 → 系统尝试发放类型1的优惠券（`issueSource=2`）

**当前处理**：
- ✅ 好评时：正常发放类型1的优惠券
- ✅ 收藏时：**不会重复发放**（因为检查发现用户已领取过类型1）

**结果**：用户只会获得1张类型1的优惠券

## 问题总结

### 当前存在的问题

1. **逻辑不一致**：
   - 收藏店铺时会检查是否已领取（按类型）
   - 好评送券时不检查是否已领取
   - 导致行为不一致

2. **可能重复发放**：
   - 如果先收藏后好评，会重复发放同类型的优惠券
   - 如果先好评后收藏，不会重复发放

3. **业务规则不明确**：
   - 是否允许用户通过不同方式获得同类型的优惠券？
   - 如果允许，为什么收藏时会阻止？
   - 如果不允许，为什么好评时不阻止？

## 解决方案 ✅ 已采用

### 业务规则确认

**业务规则**：好评赠券和收藏领券不冲突，可以分别领取

**逻辑**：
- 收藏店铺时：只检查是否通过收藏领取过（`issueSource=2`），不检查好评等其他方式
- 好评送券时：不检查是否已领取过，直接发放（通过活动参与次数限制控制）

**实现**：
1. ✅ 收藏店铺时只检查 `issueSource=2` 的优惠券
2. ✅ 好评送券时不检查是否已领取过（通过活动参与次数限制控制）

**优点**：
- ✅ 允许用户通过不同方式获得同类型优惠券
- ✅ 鼓励用户既收藏又好评
- ✅ 逻辑清晰，互不干扰

**场景示例**：
- 用户收藏店铺 → 领取类型1的优惠券（`issueSource=2`）
- 用户给店铺好评 → 再领取类型1的优惠券（`issueSource=3`）
- 结果：用户获得2张类型1的优惠券，分别来自收藏和好评

## 代码修改说明 ✅ 已完成

### 已修改的代码

**文件**：`LifeDiscountCouponServiceImpl.issueCouponsForStoreCollect`

**修改内容**：
```java
// 修改前：检查所有领取来源
userCouponWrapper.eq(LifeDiscountCouponUser::getUserId, userId)
        .eq(LifeDiscountCouponUser::getDeleteFlag, 0)
        .in(LifeDiscountCouponUser::getCouponId, availableCouponIds);

// 修改后：只检查收藏领取的来源（issueSource=2）
userCouponWrapper.eq(LifeDiscountCouponUser::getUserId, userId)
        .eq(LifeDiscountCouponUser::getDeleteFlag, 0)
        .eq(LifeDiscountCouponUser::getIssueSource, 2) // 只检查收藏店铺领取的
        .in(LifeDiscountCouponUser::getCouponId, availableCouponIds);
```

**效果**：
- ✅ 收藏店铺时，只检查是否通过收藏领取过，不检查好评等其他方式
- ✅ 好评送券时，不检查是否已领取过，可以正常发放
- ✅ 两种方式互不干扰，可以分别领取

### 业务规则总结

1. **收藏店铺**：
   - 每种类型只发放一张（通过收藏方式）
   - 如果已通过收藏领取过该类型，不再发放
   - 不检查是否通过好评等其他方式领取过

2. **好评送券**：
   - 不检查是否已领取过该优惠券
   - 通过活动参与次数限制控制发放
   - 可以与收藏领取的优惠券共存
