收藏和好评双重领取场景分析.md 4.8 KB

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

问题描述

有一种优惠券既可以通过收藏领取(attention_can_received=1),又可以通过好评赠券。当前逻辑会如何处理这种情况?

当前逻辑分析

1. 收藏店铺发放逻辑

位置LifeDiscountCouponServiceImpl.issueCouponsForStoreCollect

检查逻辑

// 查询用户已领取的该店铺所有优惠券(不限制领取来源)
// 通过优惠券类型判断,如果用户已领取过某类型的优惠券(无论通过什么方式),不再发放

特点

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

2. 好评送券逻辑

位置LifeDiscountCouponStoreFriendServiceImpl.issueCouponForGoodRating

检查逻辑

// 直接发放优惠券,不检查用户是否已领取过
// 只检查库存和活动参与次数限制

特点

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

场景分析

场景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

修改内容

// 修改前:检查所有领取来源
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. 好评送券

    • 不检查是否已领取过该优惠券
    • 通过活动参与次数限制控制发放
    • 可以与收藏领取的优惠券共存