peng
2 天以前 d68eaea2f5e4a0d655b9e393c104cf35987b99f4
framework/src/main/java/cn/lili/modules/lmk/service/impl/PrizeServiceImpl.java
@@ -16,6 +16,8 @@
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.order.order.entity.dos.Order;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.promotion.entity.dos.Coupon;
import cn.lili.modules.promotion.service.CouponService;
import cn.lili.mybatis.BaseEntity;
@@ -60,12 +62,18 @@
    private final PrizeRecordService prizeRecordService;
    private static final String PRIZE_PREFIX = "prize_draw:";
    private static final String PRIZE_NUMBER = "prize_number:";
    private static final String PRIZE_ADD_NUM = "prize_add_num:";
    private final RedisTemplate<String, String> redisTemplate;
    private final RedissonClient redissonClient;
    private final RocketmqCustomProperties rocketmqCustomProperties;
    private final RocketMQTemplate rocketMQTemplate;
    private final COSUtil cosUtil;
    private final CouponService couponService;
    private final AddPrizeRuleService addPrizeRuleService;
    private final ActionRecordService actionRecordService;
    private final ShareActionService shareActionService;
    private final AddNumCheekService addNumCheekService;
    private final OrderService orderService;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -390,13 +398,26 @@
        try {
            lock.lock();
            prizeNumberList = getPrizeNumberList(prizeId, userId);
            //默认生成
            boolean needGenerate = true;
            for (PrizeNumber prizeNumber : prizeNumberList) {
                String userAction = prizeNumber.getUserAction();
                if (PrizeUserActionEnum.SYSTEM.name().equals(userAction)) {
                    needGenerate = false;
                    break;
                }
            }
            // 当前用户没有初始化抽奖数据需要初始化当天抽奖数据
            if (prizeNumberList == null || prizeNumberList.isEmpty()) {
                //没有默认抽奖次数直接返回0次
            if (prizeNumberList.isEmpty() || needGenerate) {
                //没有默认抽奖次数不生成抽奖次数
                int size = prizeNumberList.size();
                if (prizeNum == null || prizeNum <= 0) {
                    return Result.ok().data(0);
                    return Result.ok().data(size);
                }
                prizeNumberList = new ArrayList<>();
                if (size+prizeNum>activity.getMaxPrize()){
                    prizeNum =  activity.getMaxPrize()-size;
                }
                //设置默认抽奖次数并返回默认抽奖次数
                for (int i = 0; i < prizeNum; i++) {
                    PrizeNumber prizeNumber = new PrizeNumber();
@@ -408,13 +429,9 @@
                }
                //添加抽奖次数并返回
                prizeNumberService.saveBatch(prizeNumberList);
                return Result.ok().data(prizeNumberList.size());
                return Result.ok().data(prizeNumberList.size()+size);
            }
        } finally {
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
        Integer maxPrize = activity.getMaxPrize();
        //其他情况
        int useNum = 0;
@@ -431,6 +448,24 @@
            return Result.ok().data(0);
        } else {
            return Result.ok().data(userPrizeNum > maxPrize ? maxPrize - useNum : notUseNum);
        }
        } finally {
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
                @Override
                public void afterCommit() {
                    if (lock.isHeldByCurrentThread()) {
                        lock.unlock();
                    }
                }
                @Override
                public void afterCompletion(int status) {
                    if (lock.isHeldByCurrentThread()) {
                        lock.unlock();
                    }
                }
            });
        }
    }
@@ -490,6 +525,28 @@
    @Override
    public Result addPrizeNum(AddPrizeNumForm addPrizeNumForm) {
        //指定活动给指定活动添加没指定活动给默认活动添加
        String prizeActivityId = addPrizeNumForm.getPrizeActivityId();
        if (StringUtils.isBlank(prizeActivityId)) {
            LambdaQueryWrapper<PrizeActivity> pop = Wrappers.<PrizeActivity>lambdaQuery()
                    .eq(PrizeActivity::getEnableStatus, PrizeActivityStatusEnum.ON.name())
                    .eq(PrizeActivity::getPopup, true);
            PrizeActivity one = prizeActivityService.getOne(pop);
            if (one == null) {
                return Result.ok().data(0);
            }
            addPrizeNumForm.setPrizeActivityId(one.getId());
        }
        AuthUser currentUser = UserContext.getCurrentUser();
        if (currentUser == null) {
            return Result.ok().data(0);
        }
        //指定用户给指定用户添加没指定活动给当前登录用户添加
        if (StringUtils.isBlank(addPrizeNumForm.getUserId())) {
            addPrizeNumForm.setUserId(currentUser.getId());
        }
        PrizeActivity activity = prizeActivityService.getById(addPrizeNumForm.getPrizeActivityId());
        if (activity == null) {
            throw new ServiceException("当前活动不存在");
@@ -512,25 +569,158 @@
        if (actionEnum == null) {
            throw new ServiceException("当前类型不存在");
        }
        //todo 进行数据校验
        switch (actionEnum) {
            case BUY:
                System.err.println("BUY");
                break;
            case SHARE:
                //直接获得抽奖次数
                System.err.println("SHARE");
                break;
            case SEE_SHOP:
                System.err.println("SEE_SHOP");
                break;
            case SEE_VIDEO:
                System.err.println("SEE_VIDEO");
                break;
            default:
        AddPrizeRule addPrizeRule = getAddPrizeRule(actionEnum.name());
        if (addPrizeRule == null) {
            return Result.ok().data(0);
        }
        List<PrizeNumber>  needAdd = new ArrayList<>();
        Integer addNum = addPrizeRule.getAddNum();
        if (addNum == null) {
            return Result.ok().data(0);
        }
        //判读添加后是否大于最大次数
        if (prizeNumberList.size()+addNum >= maxPrize){
            addNum = maxPrize-prizeNumberList.size();
        }
        boolean addFlag = false;
        //判断该类型当天是否添加过了
        for (PrizeNumber prizeNumber : prizeNumberList) {
            if (actionEnum.name().equals(prizeNumber.getUserAction())) {
                addFlag =  true;
                break;
        }
        return null;
        }
        String extend = addPrizeNumForm.getExtend();
        JSONObject jsonObject = JSONObject.parseObject(extend);
        LambdaQueryWrapper<AddNumCheek> query = Wrappers.lambdaQuery();
        AddNumCheek addNumCheek = null;
        String orderSn = null;
        Order order = null;
        String ruleValue= null;
        switch (actionEnum) {
            case SHARE_GOODS_VIDEO:
                String shareId = jsonObject.getString("shareId");
                ShareAction shareAction = shareActionService.getById(shareId);
                if (shareAction == null) {
                    return Result.ok().data(0);
                }
                if (addFlag){
                    log.info("当前用户当天已经添加过了分享添加次数了-------->{}",userId);
                    return Result.ok().data(0);
                }
                break;
            case SHARE_USER_REGISTRY:
                String memberId = jsonObject.getString("memberId");
                query.eq(AddNumCheek::getType,PrizeUserActionEnum.SHARE_USER_REGISTRY.name())
                        .eq(AddNumCheek::getCheckNo, memberId);
                if (addNumCheekService.getOne(query) != null) {
                    log.info("当前用户已经被邀请过了----------------->{}",memberId);
                    return Result.ok().data(0);
                }
                addNumCheek =  new AddNumCheek();
                addNumCheek.setType(PrizeUserActionEnum.SHARE_USER_REGISTRY.name());
                addNumCheek.setUserId(userId);
                addNumCheek.setCheckNo(memberId);
                addNumCheekService.save(addNumCheek);
                break;
            case SHARE_USER_SHOPPING:
                 orderSn = jsonObject.getString("orderSn");
                //校验订单是否存在
                 order = orderService.getBySn(orderSn);
                if (order == null) {
                    log.info("分享用户购物订单不存在{}",orderSn);
                    return Result.ok().data(0);
                }
                query.eq(AddNumCheek::getType,PrizeUserActionEnum.SHARE_USER_SHOPPING.name())
                        .eq(AddNumCheek::getCheckNo, orderSn);
                if (addNumCheekService.getOne(query) != null) {
                    log.info("当前邀请订单已经被领取过了----------------->{}",orderSn);
                    return Result.ok().data(0);
                }
                addNumCheek = new AddNumCheek();
                addNumCheek.setType(PrizeUserActionEnum.SHARE_USER_SHOPPING.name());
                addNumCheek.setUserId(userId);
                addNumCheek.setCheckNo(orderSn);
                addNumCheekService.save(addNumCheek);
                break;
            case USER_STAY_TIME:
                //todo 通过用户行为分析获取数据进行判断
                 ruleValue = addPrizeRule.getRuleValue();
                if (addFlag){
                    log.info("当前用户当天已经添加过了停留时间添加次数了-------->{}",userId);
                    return Result.ok().data(0);
                }
                break;
            case USER_BUY_SUM_PRICE:
                 orderSn = jsonObject.getString("orderSn");
                //校验订单是否存在
                 order = orderService.getBySn(orderSn);
                if (order == null) {
                    log.info("用户购物订单不存在{}",orderSn);
                    return Result.ok().data(0);
                }
                ruleValue =  addPrizeRule.getRuleValue();
                double price = Double.parseDouble(ruleValue);
                Double flowPrice = order.getFlowPrice();
                if (flowPrice < price) {
                    log.info("当前购物订单金额小于添加要求----------------->{}",orderSn);
                    return Result.ok().data(0);
                }
                query.eq(AddNumCheek::getType,PrizeUserActionEnum.USER_BUY_SUM_PRICE.name())
                        .eq(AddNumCheek::getCheckNo, orderSn);
                if (addNumCheekService.getOne(query) != null) {
                    log.info("当前购物订单已经被领取过了----------------->{}",orderSn);
                    return Result.ok().data(0);
                }
                addNumCheek = new AddNumCheek();
                addNumCheek.setType(PrizeUserActionEnum.USER_BUY_SUM_PRICE.name());
                addNumCheek.setUserId(userId);
                addNumCheek.setCheckNo(orderSn);
                addNumCheekService.save(addNumCheek);
                break;
            case USER_BUY_ORDER_NUM:
                orderSn = jsonObject.getString("orderSn");
                //校验订单是否存在
                order = orderService.getBySn(orderSn);
                if (order == null) {
                    log.info("用户购物数量订单不存在{}",orderSn);
                    return Result.ok().data(0);
                }
                query.eq(AddNumCheek::getType,PrizeUserActionEnum.USER_BUY_ORDER_NUM.name())
                        .eq(AddNumCheek::getCheckNo, orderSn);
                if (addNumCheekService.getOne(query) != null) {
                    log.info("当前购物订单数量已经被领取过了----------------->{}",orderSn);
                    return Result.ok().data(0);
                }
                addNumCheek = new AddNumCheek();
                addNumCheek.setType(PrizeUserActionEnum.USER_BUY_ORDER_NUM.name());
                addNumCheek.setUserId(userId);
                addNumCheek.setCheckNo(orderSn);
                addNumCheekService.save(addNumCheek);
                break;
            case USER_SCAN_STORE:
                break;
            case USER_PUBLISH_EXAMINE:
                break;
            default:
                return Result.ok().data(0);
        }
        //设置默认抽奖次数并返回默认抽奖次数
        for (int i = 0; i < addNum; i++) {
            PrizeNumber prizeNumber = new PrizeNumber();
            prizeNumber.setActivityPrizeId(Long.parseLong(addPrizeNumForm.getPrizeActivityId()));
            prizeNumber.setUserId(Long.parseLong(userId));
            prizeNumber.setUserAction(actionEnum.name());
            prizeNumber.setUseStatus(PrizeNumberUseEnum.WAIT.name());
            needAdd.add(prizeNumber);
        }
        prizeNumberService.saveBatch(needAdd);
        return Result.ok().data(0);
    }
    public  AddPrizeRule getAddPrizeRule(String ruleCode) {
        LambdaQueryWrapper<AddPrizeRule> one = Wrappers.<AddPrizeRule>lambdaQuery().eq(AddPrizeRule::getRuleCode, ruleCode);
       return addPrizeRuleService.getOne(one);
    }
}