peng
8 小时以前 64afdb6371aef321db882f3659ba1d2c2e82ad41
扫码领取门店优惠卷调整
6个文件已修改
1个文件已添加
128 ■■■■■ 已修改文件
buyer-api/src/main/java/cn/lili/controller/lmk/StoreCouponClaimController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCoupon.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponClaimRecord.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
buyer-api/src/main/java/cn/lili/controller/lmk/StoreCouponClaimController.java
New file
@@ -0,0 +1,33 @@
package cn.lili.controller.lmk;
import cn.lili.base.Result;
import cn.lili.modules.lmk.service.CouponVirtualService;
import cn.lili.modules.lmk.service.StoreCouponClaimRecordService;
import cn.lili.modules.lmk.service.StoreCouponService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Validated
@RequiredArgsConstructor
@Api(value = "小程序购物商品领取优惠卷接口", tags = "小程序购物商品领取优惠卷接口")
@RestController
@RequestMapping("/buyer/lmk/store/coupon")
public class StoreCouponClaimController {
    private final StoreCouponClaimRecordService storeCouponClaimRecordService;
    private final StoreCouponService storeCouponService;
    @PostMapping("/{id}")
    @ApiOperation(value = "领取优惠卷", notes = "领取优惠卷")
    public Result claimCoupon(@PathVariable String id){
        return storeCouponClaimRecordService.claimCoupon(id);
    }
    @GetMapping("/{id}")
    @ApiOperation(value = "获取优惠卷信息", notes = "获取优惠卷信息")
    public Result getCoupon(@PathVariable String id){
        return storeCouponService.getCoupon(id);
    }
}
framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCoupon.java
@@ -24,11 +24,11 @@
    @TableField("store_name")
    /** 店铺名称 */
    private Long storeName;
    private String storeName;
    @TableField("coupon_id")
    /** 优惠卷id */
    private Long couponId;
    private String couponId;
    @TableField("coupon_name")
    /** 优惠卷名称 */
framework/src/main/java/cn/lili/modules/lmk/domain/entity/StoreCouponClaimRecord.java
@@ -24,7 +24,7 @@
    @TableField("coupon_id")
    /** 优惠卷id */
    private Long couponId;
    private String couponId;
    @TableField("coupon_name")
    /** 优惠卷名称 */
@@ -36,7 +36,7 @@
    @TableField("user_id")
    /** 用户id */
    private Long userId;
    private String userId;
}
framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponClaimRecordService.java
@@ -5,6 +5,8 @@
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.form.StoreCouponClaimRecordForm;
import cn.lili.modules.lmk.domain.query.StoreCouponClaimRecordQuery;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
/**
@@ -62,4 +64,6 @@
     * @return
     */
    Result all();
    Result claimCoupon(String id);
}
framework/src/main/java/cn/lili/modules/lmk/service/StoreCouponService.java
@@ -5,6 +5,8 @@
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.form.StoreCouponForm;
import cn.lili.modules.lmk.domain.query.StoreCouponQuery;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
/**
@@ -62,4 +64,6 @@
     * @return
     */
    Result all();
    Result getCoupon(String id);
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponClaimRecordServiceImpl.java
@@ -1,18 +1,35 @@
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;
@@ -29,7 +46,10 @@
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
@@ -116,4 +136,55 @@
                .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();
                    }
                }
            });
        }
    }
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/StoreCouponServiceImpl.java
@@ -116,4 +116,10 @@
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
    @Override
    public Result getCoupon(String id) {
        StoreCoupon storeCoupon = this.getById(id);
        return Result.ok().data(storeCoupon);
    }
}