| | |
| | | package cn.lili.modules.lmk.service.impl; |
| | | |
| | | import cn.lili.common.exception.ServiceException; |
| | | import cn.lili.common.security.AuthUser; |
| | | import cn.lili.common.security.context.UserContext; |
| | | import cn.lili.modules.lmk.domain.entity.StoreCoupon; |
| | | import cn.lili.modules.lmk.enums.general.PrizeStatusEnum; |
| | | import cn.lili.modules.lmk.service.StoreCouponService; |
| | | import cn.lili.modules.promotion.entity.dos.MemberCoupon; |
| | | import cn.lili.modules.promotion.service.MemberCouponService; |
| | | import cn.lili.rocketmq.RocketmqSendCallbackBuilder; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import cn.lili.modules.lmk.domain.entity.StoreCouponClaimRecord; |
| | | import cn.lili.modules.lmk.mapper.StoreCouponClaimRecordMapper; |
| | | import cn.lili.modules.lmk.service.StoreCouponClaimRecordService; |
| | | import cn.lili.base.Result; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import cn.lili.modules.lmk.domain.form.StoreCouponClaimRecordForm; |
| | | import cn.lili.modules.lmk.domain.vo.StoreCouponClaimRecordVO; |
| | | import cn.lili.modules.lmk.domain.query.StoreCouponClaimRecordQuery; |
| | | import org.redisson.api.RLock; |
| | | import org.redisson.api.RedissonClient; |
| | | import org.springframework.stereotype.Service; |
| | | import lombok.RequiredArgsConstructor; |
| | | import cn.lili.utils.PageUtil; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.transaction.support.TransactionSynchronization; |
| | | import org.springframework.transaction.support.TransactionSynchronizationManager; |
| | | import org.springframework.util.Assert; |
| | | |
| | | import java.util.List; |
| | |
| | | public class StoreCouponClaimRecordServiceImpl extends ServiceImpl<StoreCouponClaimRecordMapper, StoreCouponClaimRecord> implements StoreCouponClaimRecordService { |
| | | |
| | | private final StoreCouponClaimRecordMapper storeCouponClaimRecordMapper; |
| | | |
| | | private final RedissonClient redissonClient; |
| | | private static final String STORE_COUPON_CLAIM = "store_coupon_claim:"; |
| | | private final MemberCouponService memberCouponService; |
| | | private final StoreCouponService storeCouponService; |
| | | /** |
| | | * 添加 |
| | | * @param form |
| | |
| | | .collect(Collectors.toList()); |
| | | return Result.ok().data(vos); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Result claimCoupon(String id) { |
| | | AuthUser currentUser = UserContext.getCurrentUser(); |
| | | if (currentUser == null) { |
| | | throw new ServiceException("当前用户没有登录无法领取"); |
| | | } |
| | | String userId = currentUser.getId(); |
| | | String nickName = currentUser.getNickName(); |
| | | |
| | | //锁住店铺某一个优惠卷 |
| | | RLock redissonLock = redissonClient.getLock(STORE_COUPON_CLAIM + id); |
| | | try { |
| | | redissonLock.lock(); |
| | | StoreCoupon storeCoupon = storeCouponService.getById(id); |
| | | if (storeCoupon == null) { |
| | | throw new ServiceException("当前店铺不存在优惠卷"); |
| | | } |
| | | //处理幂等问题限制一个用户只能该店铺领取一种优惠卷 |
| | | LambdaQueryWrapper<StoreCouponClaimRecord> memCoupon = Wrappers.<StoreCouponClaimRecord>lambdaQuery() |
| | | .eq(StoreCouponClaimRecord::getUserId, userId) |
| | | .eq(StoreCouponClaimRecord::getCouponId, storeCoupon.getCouponId()); |
| | | List<StoreCouponClaimRecord> list = this.list(memCoupon); |
| | | if (!list.isEmpty()){ |
| | | throw new ServiceException("当前用户已经领取过了无法再次领取"); |
| | | } |
| | | //领取对应的优惠卷写入记录 |
| | | memberCouponService.receiveCoupon(storeCoupon.getCouponId(),userId , nickName); |
| | | StoreCouponClaimRecord storeCouponClaimRecord = new StoreCouponClaimRecord(); |
| | | storeCouponClaimRecord.setCouponId(storeCoupon.getCouponId()); |
| | | storeCouponClaimRecord.setCouponName(storeCoupon.getCouponName()); |
| | | storeCouponClaimRecord.setStoreId(storeCoupon.getStoreId()); |
| | | storeCouponClaimRecord.setStoreName(storeCoupon.getStoreName()); |
| | | storeCouponClaimRecord.setUserId(userId); |
| | | this.save(storeCouponClaimRecord); |
| | | //领取成功返回优惠卷id用于跳转购物使用 |
| | | return Result.ok().data(storeCoupon.getCouponId()); |
| | | |
| | | } finally { |
| | | TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { |
| | | @Override |
| | | public void afterCommit() { |
| | | if (redissonLock.isHeldByCurrentThread()) { |
| | | redissonLock.unlock(); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | } |
| | | } |
| | | } |