|
|
@@ -65,12 +65,17 @@ public class CouponFontServiceImpl implements CouponFontService {
|
|
|
@Override
|
|
|
@Transactional(rollbackFor = Throwable.class)
|
|
|
public void collectCoupon(CouponCollectReq couponCollectReq, Long userId) {
|
|
|
- collectCommonCheck(couponCollectReq.getCouponId(), userId);
|
|
|
- CouponActive couponActive = couponActiveMapper.selectById(couponCollectReq.getCouponActiveId());
|
|
|
- if (couponActive == null) {
|
|
|
+ if (couponCollectReq == null || couponCollectReq.getCouponId() == null || couponCollectReq.getCouponActiveId() == null) {
|
|
|
+ throw BusinessRuntimeException.getInstance("缺少优惠券领取参数");
|
|
|
+ }
|
|
|
+ // Inventory is protected by subRemainNum's compare-and-update predicate.
|
|
|
+ CouponActive couponActive = couponActiveMapper.selectById(couponCollectReq.getCouponActiveId());
|
|
|
+ if (couponActive == null || !java.util.Objects.equals(couponActive.getCouponId(), couponCollectReq.getCouponId())
|
|
|
+ || !Boolean.TRUE.equals(couponActive.getStatus()) || !Boolean.TRUE.equals(couponActive.getExpiryStatus())) {
|
|
|
throw BusinessRuntimeException.getInstance("该发放优惠券不存在");
|
|
|
}
|
|
|
- if (couponActive.getRemainNum() <= 0) {
|
|
|
+ collectCommonCheck(couponActive.getCouponId(), userId);
|
|
|
+ if (couponActive.getRemainNum() == null || couponActive.getRemainNum() <= 0) {
|
|
|
throw BusinessRuntimeException.getInstance("该优惠券已领取完");
|
|
|
}
|
|
|
|
|
|
@@ -233,9 +238,13 @@ public class CouponFontServiceImpl implements CouponFontService {
|
|
|
|
|
|
public void collectCommonCheck(Long couponId, Long userId) {
|
|
|
Coupon coupon = couponMapper.selectById(couponId);
|
|
|
- if (coupon == null || !coupon.getDeleted()) {
|
|
|
+ if (coupon == null || !Boolean.TRUE.equals(coupon.getDeleted())) {
|
|
|
throw BusinessRuntimeException.getInstance("该优惠券不存在");
|
|
|
}
|
|
|
+ if (Boolean.TRUE.equals(coupon.getIsValidTime()) &&
|
|
|
+ (coupon.getValidEndTime() == null || !coupon.getValidEndTime().after(new Date()))) {
|
|
|
+ throw BusinessRuntimeException.getInstance("该优惠券已失效");
|
|
|
+ }
|
|
|
//是否可领取
|
|
|
if (coupon.getScope() == Coupon.Scope.newUser) {
|
|
|
//注册后从没产生过虚拟订单的用户,产生过退款后也不是新用户
|
|
|
@@ -370,7 +379,7 @@ public class CouponFontServiceImpl implements CouponFontService {
|
|
|
try {
|
|
|
couponUserMapper.insert(couponUser);
|
|
|
} catch (DuplicateKeyException e) {
|
|
|
- log.info("用户:{}重复领取优惠券{}插入数据错误", userId, couponId);
|
|
|
+ throw BusinessRuntimeException.getInstance("您已领取该优惠券,请勿重复领取");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -390,14 +399,28 @@ public class CouponFontServiceImpl implements CouponFontService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public CouponUserView receiveCoupon(long userId, Long couponId, CouponUser.Channel channel) {
|
|
|
- try {
|
|
|
- receiveCouponUser(couponId, userId, channel);
|
|
|
- } catch (Exception e) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- return getCouponDetailById(userId, couponId);
|
|
|
- }
|
|
|
+ @Transactional(rollbackFor = Throwable.class)
|
|
|
+ public CouponUserView receiveCoupon(long userId, Long couponId, CouponUser.Channel channel) {
|
|
|
+ if (couponId == null || couponId <= 0) throw BusinessRuntimeException.getInstance("优惠券不存在");
|
|
|
+ Coupon coupon = couponMapper.selectById(couponId);
|
|
|
+ if (coupon == null) throw BusinessRuntimeException.getInstance("优惠券不存在");
|
|
|
+ if (channel == CouponUser.Channel.manual) {
|
|
|
+ // Public callers may only claim coupons explicitly published to the center.
|
|
|
+ CouponActive active = couponActiveMapper.selectOne(Wrappers.lambdaQuery(CouponActive.class)
|
|
|
+ .eq(CouponActive::getCouponId, couponId).eq(CouponActive::getStatus, true)
|
|
|
+ .eq(CouponActive::getExpiryStatus, true).gt(CouponActive::getRemainNum, 0)
|
|
|
+ .orderByAsc(CouponActive::getId).last("LIMIT 1"));
|
|
|
+ if (active == null) throw BusinessRuntimeException.getInstance("该优惠券未开放领取");
|
|
|
+ CouponCollectReq req = new CouponCollectReq();
|
|
|
+ req.setCouponId(couponId);
|
|
|
+ req.setCouponActiveId(active.getId());
|
|
|
+ collectCoupon(req, userId);
|
|
|
+ } else {
|
|
|
+ collectCommonCheck(couponId, userId);
|
|
|
+ receiveCouponUser(couponId, userId, channel);
|
|
|
+ }
|
|
|
+ return getCouponDetailById(userId, couponId);
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
public List<CouponView> getGoodsUserActivityCoupons(long userId) throws Exception {
|