|  | @@ -1,25 +1,41 @@
 | 
	
		
			
				|  |  |  package com.yonge.cooleshow.biz.dal.service.impl;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 | 
	
		
			
				|  |  |  import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.dao.ActivityPlanStandardDao;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
 | 
	
		
			
				|  |  | -import com.yonge.cooleshow.biz.dal.entity.*;
 | 
	
		
			
				|  |  | -import com.yonge.cooleshow.biz.dal.service.*;
 | 
	
		
			
				|  |  | -import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.ActivityPlanStandard;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.ActivityRegistration;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.entity.UserFirstTime;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.ActivityPlanRewardService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.ActivityPlanStandardService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.ActivityRegistrationService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.ActivityUserRewardService;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.biz.dal.service.UserFirstTimeService;
 | 
	
		
			
				|  |  |  import com.yonge.cooleshow.biz.dal.vo.ActivityPlanVo;
 | 
	
		
			
				|  |  | -import com.yonge.cooleshow.common.enums.*;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.common.enums.CacheNameEnum;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.common.enums.ConditionMethodEnum;
 | 
	
		
			
				|  |  | +import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 | 
	
		
			
				|  |  |  import com.yonge.toolset.payment.util.DistributedLock;
 | 
	
		
			
				|  |  | +import org.apache.commons.collections.MapUtils;
 | 
	
		
			
				|  |  | +import org.joda.time.DateTime;
 | 
	
		
			
				|  |  |  import org.redisson.api.RedissonClient;
 | 
	
		
			
				|  |  | -import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | -import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  import org.slf4j.Logger;
 | 
	
		
			
				|  |  |  import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  | -import com.yonge.cooleshow.biz.dal.dao.ActivityPlanStandardDao;
 | 
	
		
			
				|  |  | +import org.springframework.beans.factory.annotation.Autowired;
 | 
	
		
			
				|  |  | +import org.springframework.stereotype.Service;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import java.util.*;
 | 
	
		
			
				|  |  | +import java.util.Date;
 | 
	
		
			
				|  |  | +import java.util.List;
 | 
	
		
			
				|  |  | +import java.util.Map;
 | 
	
		
			
				|  |  | +import java.util.Optional;
 | 
	
		
			
				|  |  |  import java.util.stream.Collectors;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -94,52 +110,53 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          String timeType = planStandard.getCondition();
 | 
	
		
			
				|  |  |          search.setTimeType(timeType);
 | 
	
		
			
				|  |  | -        List<String> timeTypes = WrapperUtil.toList(timeType);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        List<UserFirstTime> userFirstTimes = userFirstTimeService.selectAllList(search);
 | 
	
		
			
				|  |  | -        if (CollectionUtils.isEmpty(userFirstTimes)) {
 | 
	
		
			
				|  |  | +        // 达标活动匹配条件数
 | 
	
		
			
				|  |  | +        int conditionNum = planStandard.getCondition().split(",").length;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        // 用户激活时间
 | 
	
		
			
				|  |  | +        Map<Long, List<Long>> userActiveTimeMap = userFirstTimeService.selectAllList(search).stream()
 | 
	
		
			
				|  |  | +                .collect(Collectors.groupingBy(UserFirstTime::getUserId,
 | 
	
		
			
				|  |  | +                        Collectors.mapping(x -> new DateTime(x.getTime()).getMillis(), Collectors.toList())));
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (MapUtils.isEmpty(userActiveTimeMap)) {
 | 
	
		
			
				|  |  |              return true;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        Map<Long, Date> userIdSortMap = new LinkedHashMap<>();
 | 
	
		
			
				|  |  | -        if (ConditionMethodEnum.OR.equals(planStandard.getCalculationMethod())) {
 | 
	
		
			
				|  |  | -            for (int i = 0; i < userFirstTimes.size(); i++) {
 | 
	
		
			
				|  |  | -                UserFirstTime userFirstTime = userFirstTimes.get(i);
 | 
	
		
			
				|  |  | -                if (null == userIdSortMap.get(userFirstTime.getUserId())) {
 | 
	
		
			
				|  |  | -                    userIdSortMap.put(userFirstTime.getUserId(), userFirstTime.getTime());
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -            for (int i = (userFirstTimes.size() - 1); i >= 0; i--) {
 | 
	
		
			
				|  |  | -                UserFirstTime userFirstTime = userFirstTimes.get(i);
 | 
	
		
			
				|  |  | -                if (null == userIdSortMap.get(userFirstTime.getUserId())) {
 | 
	
		
			
				|  |  | -                    userIdSortMap.put(userFirstTime.getUserId(), userFirstTime.getTime());
 | 
	
		
			
				|  |  | -                }
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          List<ActivityPlanRewardDto> activityPlanRewardDtos = activityPlanRewardService.queryActivityPlanReward(activityId);
 | 
	
		
			
				|  |  | -        Map<Long, List<UserFirstTime>> userMap = userFirstTimes.stream().collect(Collectors.groupingBy(UserFirstTime::getUserId));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        if (ConditionMethodEnum.OR.equals(planStandard.getCalculationMethod())) {
 | 
	
		
			
				|  |  | -            for (Long userId : userIdSortMap.keySet()) {
 | 
	
		
			
				|  |  | -                Date createTime = userIdSortMap.get(userId);
 | 
	
		
			
				|  |  | -                //给用户发奖
 | 
	
		
			
				|  |  | -                sendUserReward(userId, detail.getId(), createTime, activityPlanRewardDtos);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        } else {
 | 
	
		
			
				|  |  | -            List<Long> mainList = new ArrayList<>();
 | 
	
		
			
				|  |  | -            mainList.addAll(userIdSortMap.keySet());
 | 
	
		
			
				|  |  | -            Collections.reverse(mainList);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            for (Long userId : mainList) {
 | 
	
		
			
				|  |  | -                Date createTime = userIdSortMap.get(userId);
 | 
	
		
			
				|  |  | -                List<UserFirstTime> firstTimes = userMap.get(userId);
 | 
	
		
			
				|  |  | -                if (firstTimes.size() == timeTypes.size()) {
 | 
	
		
			
				|  |  | -                    //给用户发奖
 | 
	
		
			
				|  |  | -                    sendUserReward(userId, detail.getId(), createTime, activityPlanRewardDtos);
 | 
	
		
			
				|  |  | +        // 用户信息
 | 
	
		
			
				|  |  | +        for (Map.Entry<Long, List<Long>> entry : userActiveTimeMap.entrySet()) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            // 奖品信息
 | 
	
		
			
				|  |  | +            for (ActivityPlanRewardDto item : activityPlanRewardDtos) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if (ConditionMethodEnum.OR.equals(planStandard.getCalculationMethod())) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    // 满足其一
 | 
	
		
			
				|  |  | +                    long timestamp = entry.getValue().stream().mapToLong(Long::longValue).min().orElse(0L);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    if (timestamp > 0) {
 | 
	
		
			
				|  |  | +                        //给用户发奖
 | 
	
		
			
				|  |  | +                        sendUserReward(entry.getKey(), detail.getId(), new Date(timestamp), activityPlanRewardDtos);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    // 全部满足
 | 
	
		
			
				|  |  | +                    long timestamp = entry.getValue().stream().mapToLong(Long::longValue).max().orElse(0L);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    if (timestamp > 0 && entry.getValue().size() == conditionNum) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                        //给用户发奖
 | 
	
		
			
				|  |  | +                        sendUserReward(entry.getKey(), detail.getId(), new Date(timestamp), activityPlanRewardDtos);
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |          return true;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 |