LeafCoupenHelpOpenHandler.java 5.69 KB
package com.zhaoonline.coupen.handler;

import com.zhaoonline.coupen.bean.CommonCoupenEntity;
import com.zhaoonline.coupen.bean.CommonCoupenSeed;
import com.zhaoonline.coupen.bean.LeafCoupenEntity;
import com.zhaoonline.coupen.bean.OwnerUser;
import com.zhaoonline.coupen.cache.RandomCache;
import com.zhaoonline.coupen.dispatcher.CoupenDispatchHandler;
import com.zhaoonline.coupen.dispatcher.UserCoupenMappingHandler;
import com.zhaoonline.coupen.lifecycle.LifeCycle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;

import java.util.List;

/**
 * Created by ZhaoOnline<br/>
 * User: yangyoupeng<br/>
 * Date: 2016/12/16<br/>
 * Time: 13:57<br/>
 * Description:该类主要服务于用户投资币。适用于即拆即用的帮拆红包。由于帮拆的好友,一个帮拆好友可以帮三个好友拆。
 */
public class LeafCoupenHelpOpenHandler {
    private CoupenDispatchHandler coupenDispatcher = null;
    private UserCoupenMappingHandler userCoupenMappingHandler= null;

    private ActivityHandler activityHandler =null;
    private LifeCycle lifeCycle = new LifeCycle();
    private RandomCache<String,RandomCache<String,LeafCoupenEntity>> coupen2LeafCoupenCache=new RandomCache<String,RandomCache<String,LeafCoupenEntity>>();

    @Autowired
    public LeafCoupenHelpOpenHandler(CoupenDispatchHandler coupenDispatcher, UserCoupenMappingHandler userCoupenMappingHandler){
        this.coupenDispatcher = coupenDispatcher;
        this.userCoupenMappingHandler =  userCoupenMappingHandler;
        activityHandler = new ActivityHandler(coupenDispatcher,userCoupenMappingHandler);
        lifeCycle.markStart();
    }

    /**
     * 要对好友的帮拆次数进行判断
     * @param coupenEntity
     * @param helper 帮拆好友的信息.
     * @return
     */
    public CommonCoupenEntity processRequest(CommonCoupenEntity coupenEntity, OwnerUser helper){

        CommonCoupenSeed seed = coupenEntity.getSeed();
        if(ObjectUtils.isEmpty(seed)){
            return null;
        }
        warmCache(coupenEntity);

        //帮拆的朋友,自己获得一个红包。
        CommonCoupenEntity coupenOftheHelper=activityHandler.processRequest(seed.getActivity(),helper);

        //根据coupenEntity实体获取该coupen对应的叶子CoupenEntity
        RandomCache<String,LeafCoupenEntity> leafCouppenEntityCache=coupen2LeafCoupenCache.getCache(coupenEntity.getCoupenID());
        if(ObjectUtils.isEmpty(leafCouppenEntityCache)){
            getOrcacheLeafCounpens(coupenEntity, leafCouppenEntityCache);
        }

        //分配一个叶子CoupenEntity
        CommonCoupenEntity mappedCoupenEntity = dispacthOneLeafCoupen(coupenEntity, leafCouppenEntityCache);
        if(!ObjectUtils.isEmpty(mappedCoupenEntity)){
            //记录帮拆信息。。。
            boolean  helpOpenResult=this.userCoupenMappingHandler.recordHelpOpen(mappedCoupenEntity,helper);
        }
        return coupenOftheHelper;
    }

    private boolean warmCache(CommonCoupenEntity coupenEntity) {
        //如果标记了,不需要进行缓存重置
        if(lifeCycle.checkNeedReload()){
            activityHandler.getLifeCycle().markNeedReload();
            coupen2LeafCoupenCache.clear();
        }
        return true;
    }

    private void getOrcacheLeafCounpens(CommonCoupenEntity coupenEntity, RandomCache<String, LeafCoupenEntity> leafCouppenEntityCache) {
        List<CommonCoupenEntity> leafCoupens= coupenDispatcher.dispacthCoupenEntityUsingCoupen(coupenEntity);
        for(CommonCoupenEntity counpen:leafCoupens){
            LeafCoupenEntity leafCoupenEntity = new LeafCoupenEntity();
            leafCoupenEntity.setCoupenID(counpen.getCoupenID());
            leafCoupenEntity.setParentCoupen(coupenEntity);
            leafCoupenEntity.setAmount(counpen.getAmount());
            leafCoupenEntity.setOwnerUser(counpen.getOwnerUser());
            leafCoupenEntity.setSeed(counpen.getSeed());
            leafCoupenEntity.setDistributeDate(counpen.getDistributeDate());
            leafCouppenEntityCache.put(leafCoupenEntity.getCoupenID(),leafCoupenEntity);
        }
    }

    private CommonCoupenEntity dispacthOneLeafCoupen(CommonCoupenEntity coupenEntity, RandomCache<String, LeafCoupenEntity> leafCouppenEntityCache) {
        OwnerUser owner = coupenEntity.getOwnerUser();
        LeafCoupenEntity unmappedLeafCoupenEntity=null;
        CommonCoupenEntity mappedCoupenEntity=null;
        while(ObjectUtils.isEmpty(unmappedLeafCoupenEntity)){
            unmappedLeafCoupenEntity=randomGetCoupenFromCache(leafCouppenEntityCache);
            if(ObjectUtils.isEmpty(unmappedLeafCoupenEntity)){
                leafCouppenEntityCache.remove(coupenEntity.getCoupenID());
                break;
            }
            //若是该Coupen已经被领取了。直接删除缓存,然后直接返回
            if(!ObjectUtils.isEmpty(unmappedLeafCoupenEntity.getOwnerUser())){
                leafCouppenEntityCache.remove(unmappedLeafCoupenEntity.getCoupenID());
                break;
            }
            //这一步主要是将coupen和用户进行关系映射
            mappedCoupenEntity=userCoupenMappingHandler.mappingCoupen2User(unmappedLeafCoupenEntity,owner);
            //都需要将已经处理过的entity从缓存中删除
            leafCouppenEntityCache.remove(unmappedLeafCoupenEntity.getCoupenID());
       }
        return mappedCoupenEntity;
    }


    private LeafCoupenEntity randomGetCoupenFromCache(RandomCache<String,LeafCoupenEntity> coupenCacheOfSeed){
        //随机获取一个红包ID
        String coupenEntityID=coupenCacheOfSeed.randomKey();
        LeafCoupenEntity coupenEntity=coupenCacheOfSeed.getCache(coupenEntityID);
        return coupenEntity;
    }

}