| | |
| | | import cn.lili.common.properties.RocketmqCustomProperties; |
| | | import cn.lili.common.security.AuthUser; |
| | | import cn.lili.common.security.context.UserContext; |
| | | import cn.lili.common.utils.BeanUtil; |
| | | import cn.lili.common.utils.StringUtils; |
| | | import cn.lili.modules.lmk.domain.entity.*; |
| | | import cn.lili.modules.lmk.domain.form.AddPrizeNumForm; |
| | |
| | | import cn.lili.modules.lmk.domain.vo.PrizeDetailVO; |
| | | import cn.lili.modules.lmk.domain.vo.PrizeProbabilityVO; |
| | | import cn.lili.modules.lmk.domain.vo.PrizeRecordTimeVO; |
| | | import cn.lili.modules.lmk.domain.vo.PrizeResultVO; |
| | | import cn.lili.modules.lmk.enums.general.*; |
| | | import cn.lili.modules.lmk.service.*; |
| | | import cn.lili.modules.promotion.entity.dos.Coupon; |
| | | import cn.lili.modules.promotion.service.CouponService; |
| | | import cn.lili.mybatis.BaseEntity; |
| | | import cn.lili.rocketmq.RocketmqSendCallbackBuilder; |
| | | import cn.lili.utils.COSUtil; |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.IdWorker; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.rocketmq.spring.core.RocketMQTemplate; |
| | | import org.redisson.api.RLock; |
| | | import org.redisson.api.RedissonClient; |
| | | import org.springframework.beans.BeanUtils; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | |
| | | import java.util.function.Function; |
| | | import java.util.stream.Collectors; |
| | | |
| | | @Slf4j |
| | | @Service |
| | | @RequiredArgsConstructor |
| | | public class PrizeServiceImpl implements PrizeService { |
| | |
| | | private final RocketmqCustomProperties rocketmqCustomProperties; |
| | | private final RocketMQTemplate rocketMQTemplate; |
| | | private final COSUtil cosUtil; |
| | | private final CouponService couponService; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | |
| | | } |
| | | BigDecimal max = currentProbability.multiply(BigDecimal.valueOf(100)); |
| | | BigDecimal bigDecimal = generateRandom(BigDecimal.ONE, max); |
| | | try { |
| | | log.info("抽奖号码为---------------------------->{}", bigDecimal); |
| | | log.info("抽奖概率集合为------------------------->{}", JSONObject.toJSONString(prizeProbabilityList)); |
| | | } catch (Exception e) { |
| | | log.error("打印抽奖信息报错----------------------->", e); |
| | | } |
| | | for (PrizeProbabilityVO prizeProbabilityVO : prizeProbabilityList) { |
| | | BigDecimal minP = prizeProbabilityVO.getProbability()[0][0]; |
| | | BigDecimal maxP = prizeProbabilityVO.getProbability()[0][1]; |
| | |
| | | prizeWon = prizeProbabilityVO.getActivityPrizeRefId(); |
| | | break; |
| | | } |
| | | } |
| | | Coupon coupon = null; |
| | | //校验优惠卷是否允许用户多领不允许当未中奖处理 |
| | | if (prizeWon != null) { |
| | | ActivityRefPrize activityRefPrize = canPrizeMap.get(prizeWon); |
| | | String prizeDrawId = activityRefPrize.getPrizeId(); |
| | | PrizeDraw prizeDraw = prizeDrawService.getById(prizeDrawId); |
| | | String couponId = prizeDraw.getCouponId(); |
| | | coupon = couponService.getById(couponId); |
| | | if (coupon == null) { |
| | | prizeWon = null; |
| | | } else { |
| | | Integer couponLimitNum = coupon.getCouponLimitNum(); |
| | | //获取用户这个优惠卷的中奖情况 |
| | | LambdaQueryWrapper<PrizeRecord> eq = Wrappers.<PrizeRecord>lambdaQuery() |
| | | .eq(PrizeRecord::getUserId, userId) |
| | | .eq(PrizeRecord::getPrizeActivityId, prizeId) |
| | | .eq(PrizeRecord::getPrizeId, prizeDrawId); |
| | | int size = prizeRecordService.list(eq).size(); |
| | | if ( couponLimitNum>0 && size >= couponLimitNum) { |
| | | log.info("触发优惠卷领取限制---------->{}",prizeWon); |
| | | prizeWon = null; |
| | | } |
| | | } |
| | | |
| | | } |
| | | //未中奖的情况 |
| | | if (prizeWon == null) { |
| | |
| | | // if (!lock.equals(nowLock)) { |
| | | // throw new RuntimeException("当前活动太火爆了请稍后再试"); |
| | | // } |
| | | String couponId = coupon.getId(); |
| | | // 走mq异步处理 |
| | | TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() { |
| | | @Override |
| | |
| | | rocketMQTemplate.asyncSend(destination, JSON.toJSONString(prizeRecord), RocketmqSendCallbackBuilder.commonCallback()); |
| | | } |
| | | }); |
| | | return Result.ok().data(activityRefPrize); |
| | | PrizeResultVO prizeResultVO = new PrizeResultVO(); |
| | | BeanUtils.copyProperties(activityRefPrize, prizeResultVO); |
| | | prizeResultVO.setCouponId(couponId); |
| | | return Result.ok().data(prizeResultVO); |
| | | } |
| | | |
| | | public static BigDecimal generateRandom(BigDecimal min, BigDecimal max) { |
| | |
| | | if (actionEnum == null) { |
| | | throw new ServiceException("当前类型不存在"); |
| | | } |
| | | Boolean check ; |
| | | //todo 进行数据校验 |
| | | //todo 进行数据校验 |
| | | switch (actionEnum) { |
| | | case BUY: |
| | | System.err.println("BUY"); |