peng
16 小时以前 c37592f87c700d7301d595af7a8259c4f78040e7
抽奖活动
3个文件已修改
2个文件已添加
201 ■■■■■ 已修改文件
buyer-api/src/main/java/cn/lili/controller/lmk/PrizeController.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
consumer/src/main/java/cn/lili/listener/PrizeMessageListener.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/form/AddPrizeNumForm.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/enums/general/PrizeUserActionEnum.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
buyer-api/src/main/java/cn/lili/controller/lmk/PrizeController.java
@@ -1,14 +1,12 @@
package cn.lili.controller.lmk;
import cn.lili.base.Result;
import cn.lili.modules.lmk.domain.form.AddPrizeNumForm;
import cn.lili.modules.lmk.service.PrizeService;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
@Validated
@RequiredArgsConstructor
@@ -28,6 +26,7 @@
    public Result prize(@PathVariable String prizeActivityId) {
        return prizeService.prize(prizeActivityId);
    }
    /**
     * 获取抽奖次数
     *
@@ -38,6 +37,7 @@
    public Result prizeNum(@PathVariable String prizeActivityId) {
        return prizeService.prizeNum(prizeActivityId);
    }
    /**
     * 获取获取抽奖页面信息
     *
@@ -48,6 +48,7 @@
    public Result prizeInfo(@PathVariable String prizeActivityId) {
        return prizeService.prizeInfo(prizeActivityId);
    }
    /**
     * 获取获取最近中奖信息
     *
@@ -58,4 +59,15 @@
    public Result grantRecord(@PathVariable String prizeActivityId) {
        return prizeService.grantRecord(prizeActivityId);
    }
    /**
     * 增加抽奖次数
     *
     * @param prizeActivityId
     * @return
     */
    @PostMapping("/addPrizeNum/{prizeActivityId}")
    public Result addPrizeNum(@PathVariable String prizeActivityId, @RequestBody AddPrizeNumForm addPrizeNumForm) {
        return prizeService.grantRecord(prizeActivityId);
    }
}
consumer/src/main/java/cn/lili/listener/PrizeMessageListener.java
New file
@@ -0,0 +1,155 @@
package cn.lili.listener;
import cn.lili.cache.Cache;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.exception.ServiceException;
import cn.lili.elasticsearch.EsSuffix;
import cn.lili.modules.lmk.domain.dto.VideoEsUpdateDTO;
import cn.lili.modules.lmk.domain.entity.*;
import cn.lili.modules.lmk.domain.es.VideoIndex;
import cn.lili.modules.lmk.enums.general.PrizeDistributeStatusEnum;
import cn.lili.modules.lmk.enums.general.PrizeGrantStatusEnums;
import cn.lili.modules.lmk.enums.general.PrizeNumberUseEnum;
import cn.lili.modules.lmk.enums.general.PrizeStatusEnum;
import cn.lili.modules.lmk.service.*;
import cn.lili.modules.promotion.service.MemberCouponService;
import cn.lili.rocketmq.tags.VideoTagsEnum;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
/**
 * 抽奖活动
 *
 * @author paulG
 * @since 2020/12/9
 **/
@Component
@Slf4j
@RocketMQMessageListener(topic = "${lili.data.rocketmq.prize-topic}", consumerGroup = "${lili.data.rocketmq.prize-group}")
public class PrizeMessageListener implements RocketMQListener<MessageExt> {
    @Autowired
    private PrizeDrawService prizeDrawService;
    @Autowired
    private PrizeRecordService prizeRecordService;
    @Autowired
    private PrizeNumberService prizeNumberService;
    @Autowired
    private PrizeGrantRecordService prizeGrantRecordService;
    @Autowired
    private MemberCouponService memberCouponService;
    @Autowired
    private  RedissonClient redissonClient;
    private final static String PRIZE_GRANT_KEY = "prize_grant_key:";
    @Override
    public void onMessage(MessageExt messageExt) {
        try {
            String msg = new String(messageExt.getBody());
            log.info("收到了抽奖信息{}",msg);
            switch (PrizeStatusEnum.valueOf(messageExt.getTags())) {
                case WIN:
                    PrizeRecord prizeRecord = JSON.parseObject(msg, PrizeRecord.class);
                    RLock lock = redissonClient.getLock(PRIZE_GRANT_KEY + prizeRecord.getId());
                    try {
                        lock.lock();
                        PrizeRecord source = prizeRecordService.getById(prizeRecord.getId());
                        //当前中奖记录不存在直接返回
                        if (source == null) {
                            log.info("没有对应的中奖{}", prizeRecord.getId());
                            return;
                        }
                        //奖品不是待发放状态直接返回
                        if (!PrizeDistributeStatusEnum.WAIT.name().equals(source.getDistributeStatus())) {
                            log.info("发放状态不是待发放{}", prizeRecord.getId());
                            return;
                        }
                        //抽奖卷是否一致
                        if (!prizeRecord.getPrizeNumId().equals(source.getPrizeNumId())) {
                            log.info("抽奖卷id不一致{}", prizeRecord.getId());
                            return;
                        }
                        PrizeDraw prizeDraw = prizeDrawService.getById(prizeRecord.getPrizeId());
                        if (prizeDraw == null) {
                            log.info("当前奖品不存在{}", prizeRecord.getId());
                            return;
                        }
                        PrizeNumber number = prizeNumberService.getById(prizeRecord.getPrizeNumId());
                        if (number == null) {
                            log.info("当前抽奖券不存在{}", prizeRecord.getId());
                            return;
                        }
                        if (!PrizeNumberUseEnum.USED.name().equals(number.getUseStatus())) {
                            log.info("当前抽奖券不是已使用状态{}", prizeRecord.getId());
                            return;
                        }
                        PrizeGrantRecord grantRecord = prizeGrantRecordService.getById(prizeRecord.getId());
                        //当前奖品已经记录不需要发放
                        if (grantRecord != null) {
                            log.info("当前中奖记录已经记录{}", prizeRecord.getId());
                            return;
                        }
                        grantRecord = new PrizeGrantRecord();
                        //设置id相同使用主键防住重复发放
                        grantRecord.setId(prizeRecord.getId());
                        grantRecord.setUserId(prizeRecord.getUserId());
                        grantRecord.setNickName(prizeRecord.getNickName());
                        grantRecord.setActivityId(prizeRecord.getPrizeActivityId());
                        grantRecord.setActivityName(prizeRecord.getPrizeActivityName());
                        grantRecord.setPrizeNumId(prizeRecord.getPrizeNumId());
                        grantRecord.setPrizeName(prizeRecord.getPrizeName());
                        grantRecord.setPrizeContent(prizeRecord.getPrizeContent());
                        grantRecord.setGrantStatus(PrizeGrantStatusEnums.SUCCESS.name());
                        grantRecord.setPrizeId(prizeRecord.getPrizeId());
                        source.setDistributeStatus(PrizeDistributeStatusEnum.SUCCESS.name());
                        prizeGrantRecordService.save(grantRecord);
                        try {
                            memberCouponService.receiveCoupon(prizeDraw.getCouponId(), prizeRecord.getUserId() + "", prizeRecord.getNickName());
                        } catch (Exception e) {
                            log.error("奖品发放失败",e);
                            log.error("奖品发放失败失败的id是{}", prizeRecord.getId());
                            //报错就直接发放失败
                            source.setDistributeStatus(PrizeDistributeStatusEnum.FAILED.name());
                            grantRecord.setGrantStatus(PrizeGrantStatusEnums.FAILED.name());
                            if (e instanceof ServiceException) {
                                ResultCode resultCode = ((ServiceException) e).getResultCode();
                                if (ResultCode.COUPON_NOT_EXIST.equals(resultCode)) {
                                    grantRecord.setDes(ResultCode.COUPON_NOT_EXIST.message());
                                } else if (ResultCode.COUPON_RECEIVE_ERROR.equals(resultCode)) {
                                    grantRecord.setDes(ResultCode.COUPON_RECEIVE_ERROR.message());
                                } else if (ResultCode.COUPON_NUM_INSUFFICIENT_ERROR.equals(resultCode)) {
                                    grantRecord.setDes(ResultCode.COUPON_NUM_INSUFFICIENT_ERROR.message());
                                } else if (ResultCode.COUPON_LIMIT_ERROR.equals(resultCode)) {
                                    grantRecord.setDes(ResultCode.COUPON_LIMIT_ERROR.message());
                                }
                            }
                        }
                        prizeGrantRecordService.updateById(grantRecord);
                        //更新中奖记录表中的状态
                        prizeRecordService.updateById(source);
                        break;
                    } finally {
                        if (lock.isHeldByCurrentThread()) {
                            lock.unlock();
                        }
                    }
                default:
                    log.error("奖品发放没有匹配的标签");
                    break;
            }
        } catch (Exception e) {
            log.error("奖品发放异常", e);
        }
    }
}
framework/src/main/java/cn/lili/modules/lmk/domain/form/AddPrizeNumForm.java
New file
@@ -0,0 +1,21 @@
package cn.lili.modules.lmk.domain.form;
import lombok.Data;
@Data
public class AddPrizeNumForm {
    /**
     * 需要添加抽奖次数的用户id
     */
    private String userId;
    /**
     * 添加类型
     */
    private String addType;
    /**
     *抽奖活动id
     */
    private String prizeActivityId;
}
framework/src/main/java/cn/lili/modules/lmk/enums/general/PrizeUserActionEnum.java
@@ -6,6 +6,7 @@
@Getter
@AllArgsConstructor
public enum PrizeUserActionEnum {
    //todo 后续走后台配置获取
    /**
     * 获取优惠卷的方式
     */
framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java
@@ -420,6 +420,10 @@
            return Result.ok().data(0);
        }
        PrizeDetailVO data = prizeActivityService.prizeInfo(prizeActivityId);
        String activityCover = data.getActivityCover();
        if (StringUtils.isNotBlank(activityCover)&&!activityCover.contains("http")) {
            data.setActivityCover(cosUtil.getPreviewUrl(activityCover));
        }
        data.getPrizeInfoVOS().forEach(info -> {
            String prizeImg = info.getPrizeImg();
            String prizeCover = info.getPrizeCover();