# 收藏和好评双重领取场景分析 ## 问题描述 有一种优惠券既可以通过收藏领取(`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. **好评送券**: - 不检查是否已领取过该优惠券 - 通过活动参与次数限制控制发放 - 可以与收藏领取的优惠券共存