peng
3 天以前 656673bffffb147835f38a6f83f28cca5ee3924d
framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java
@@ -4,8 +4,11 @@
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.domain.entity.StoreCouponSingle;
import cn.lili.modules.lmk.enums.general.PrizeStatusEnum;
import cn.lili.modules.lmk.service.StoreCouponService;
import cn.lili.modules.lmk.service.StoreCouponSingleService;
import cn.lili.modules.order.order.entity.enums.ClaimStatusEnum;
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.service.MemberCouponService;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
@@ -50,6 +53,7 @@
    private static final String STORE_COUPON_CLAIM = "store_coupon_claim:";
    private final MemberCouponService memberCouponService;
    private final StoreCouponService storeCouponService;
    private final StoreCouponSingleService storeCouponSingleService;
    /**
     * 添加
     * @param form
@@ -147,33 +151,53 @@
        String userId = currentUser.getId();
        String nickName = currentUser.getNickName();
        //锁住店铺某一个优惠卷
        //锁住礼品码id
        RLock redissonLock = redissonClient.getLock(STORE_COUPON_CLAIM + id);
        try {
            redissonLock.lock();
            StoreCoupon storeCoupon = storeCouponService.getById(id);
            if (storeCoupon == null) {
                throw new ServiceException("当前店铺不存在优惠卷");
            LambdaQueryWrapper<StoreCouponSingle> forUpdate = Wrappers.<StoreCouponSingle>lambdaQuery()
                    .eq(StoreCouponSingle::getId, id).last("FOR UPDATE");
            StoreCouponSingle storeCouponSingle = storeCouponSingleService.getOne(forUpdate);
            if (storeCouponSingle == null) {
                throw new ServiceException("当前礼品码不存在");
            }
            if (!ClaimStatusEnum.NOT_CLAIM.name().equals(storeCouponSingle.getClaimStatus())) {
                throw new ServiceException("当前礼品码状态异常");
            }
            LambdaQueryWrapper<StoreCouponSingle> claimListQuery = Wrappers.<StoreCouponSingle>lambdaQuery()
                    .eq(StoreCouponSingle::getClaimUserId, userId)
                    .eq(StoreCouponSingle::getStoreCoupRef, storeCouponSingle.getStoreCoupRef())
                    .eq(StoreCouponSingle::getClaimStatus, ClaimStatusEnum.CLAIM.name());
            List<StoreCouponSingle> claimList = storeCouponSingleService.list(claimListQuery);
            if (!claimList.isEmpty()) {
                throw new ServiceException("已经领取过该类型的礼品码无法领取");
            }
            //处理幂等问题限制一个用户只能该店铺领取一种优惠卷
            LambdaQueryWrapper<StoreCouponClaimRecord> memCoupon = Wrappers.<StoreCouponClaimRecord>lambdaQuery()
                    .eq(StoreCouponClaimRecord::getUserId, userId)
                    .eq(StoreCouponClaimRecord::getCouponId, storeCoupon.getCouponId());
                    .eq(StoreCouponClaimRecord::getCouponId, storeCouponSingle.getCouponId());
            List<StoreCouponClaimRecord> list = this.list(memCoupon);
            if (!list.isEmpty()){
                throw new ServiceException("当前用户已经领取过了无法再次领取");
            }
            //更新单品被领取的记录
            storeCouponSingle.setClaimStatus(ClaimStatusEnum.CLAIM.name());
            storeCouponSingle.setClaimUserId(userId);
            storeCouponSingle.setClaimUserName(nickName);
            storeCouponSingleService.updateById(storeCouponSingle);
            //校验是否在单品卷类领取过
            //领取对应的优惠卷写入记录
            memberCouponService.receiveCoupon(storeCoupon.getCouponId(),userId , nickName);
            memberCouponService.receiveCoupon(storeCouponSingle.getCouponId(),userId , nickName);
            StoreCouponClaimRecord storeCouponClaimRecord = new StoreCouponClaimRecord();
            storeCouponClaimRecord.setCouponId(storeCoupon.getCouponId());
            storeCouponClaimRecord.setCouponName(storeCoupon.getCouponName());
            storeCouponClaimRecord.setStoreId(storeCoupon.getStoreId());
            storeCouponClaimRecord.setStoreName(storeCoupon.getStoreName());
            storeCouponClaimRecord.setCouponId(storeCouponSingle.getCouponId());
            storeCouponClaimRecord.setCouponName(storeCouponSingle.getCouponName());
            storeCouponClaimRecord.setStoreId(storeCouponSingle.getStoreId());
            storeCouponClaimRecord.setStoreName(storeCouponSingle.getStoreName());
            storeCouponClaimRecord.setUserId(userId);
            this.save(storeCouponClaimRecord);
            //领取成功返回优惠卷id用于跳转购物使用
            return Result.ok().data(storeCoupon.getCouponId());
            return Result.ok().data(storeCouponSingle.getCouponId());
        } finally {
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {