| | |
| | | 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; |
| | |
| | | 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) |
| | |
| | | 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(); |
| | |
| | | } |
| | | //添加抽奖次数并返回 |
| | | 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; |
| | |
| | | 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(); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Result addPrizeNum(AddPrizeNumForm addPrizeNumForm) { |
| | | PrizeActivity activity = prizeActivityService.getById(addPrizeNumForm.getPrizeActivityId()); |
| | | if (activity == null) { |
| | | throw new ServiceException("当前活动不存在"); |
| | | //指定活动给指定活动添加没指定活动给默认活动添加 |
| | | 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()); |
| | | } |
| | | if (!PrizeActivityStatusEnum.ON.name().equals(activity.getEnableStatus())) { |
| | | throw new ServiceException("当前活动没开启"); |
| | | } |
| | | Date date = new Date(); |
| | | //活动结束不需要添加 |
| | | if (date.after(activity.getEndTime())) { |
| | | throw new ServiceException("当前活动已结束"); |
| | | } |
| | | Integer maxPrize = activity.getMaxPrize(); |
| | | String userId = addPrizeNumForm.getUserId(); |
| | | List<PrizeNumber> prizeNumberList = getPrizeNumberList(activity.getId(), userId); |
| | | if (prizeNumberList.size() >= maxPrize) { |
| | | throw new ServiceException("抽奖次数已达到上限了"); |
| | | } |
| | | PrizeUserActionEnum actionEnum = PrizeUserActionEnum.select(addPrizeNumForm.getAddType()); |
| | | 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: |
| | | |
| | | break; |
| | | AuthUser currentUser = UserContext.getCurrentUser(); |
| | | if (currentUser == null) { |
| | | return Result.ok().data(0); |
| | | } |
| | | return null; |
| | | //指定用户给指定用户添加没指定活动给当前登录用户添加 |
| | | if (StringUtils.isBlank(addPrizeNumForm.getUserId())) { |
| | | addPrizeNumForm.setUserId(currentUser.getId()); |
| | | |
| | | } |
| | | String userId = addPrizeNumForm.getUserId(); |
| | | RLock lock = redissonClient.getLock(PRIZE_ADD_NUM + userId); |
| | | try { |
| | | |
| | | lock.lock(); |
| | | PrizeActivity activity = prizeActivityService.getById(addPrizeNumForm.getPrizeActivityId()); |
| | | if (activity == null) { |
| | | throw new ServiceException("当前活动不存在"); |
| | | } |
| | | if (!PrizeActivityStatusEnum.ON.name().equals(activity.getEnableStatus())) { |
| | | throw new ServiceException("当前活动没开启"); |
| | | } |
| | | Date date = new Date(); |
| | | //活动结束不需要添加 |
| | | if (date.after(activity.getEndTime())) { |
| | | throw new ServiceException("当前活动已结束"); |
| | | } |
| | | Integer maxPrize = activity.getMaxPrize(); |
| | | List<PrizeNumber> prizeNumberList = getPrizeNumberList(activity.getId(), userId); |
| | | if (prizeNumberList.size() >= maxPrize) { |
| | | throw new ServiceException("抽奖次数已达到上限了"); |
| | | } |
| | | PrizeUserActionEnum actionEnum = PrizeUserActionEnum.select(addPrizeNumForm.getAddType()); |
| | | if (actionEnum == null) { |
| | | throw new ServiceException("当前类型不存在"); |
| | | } |
| | | 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; |
| | | } |
| | | } |
| | | 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); |
| | | } 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(); |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | public AddPrizeRule getAddPrizeRule(String ruleCode) { |
| | | LambdaQueryWrapper<AddPrizeRule> one = Wrappers.<AddPrizeRule>lambdaQuery().eq(AddPrizeRule::getRuleCode, ruleCode); |
| | | return addPrizeRuleService.getOne(one); |
| | | } |
| | | } |