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 { @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); } } }