LeafCouponHelpOpenHandler.java 5.7 KB
package com.zhaoonline.coupon.handler;

import com.zhaoonline.coupon.domain.CommonCouponEntity;
import com.zhaoonline.coupon.domain.CommonCouponSeed;
import com.zhaoonline.coupon.domain.LeafCouponEntity;
import com.zhaoonline.coupon.domain.OwnerUser;
import com.zhaoonline.coupon.cache.RandomCache;
import com.zhaoonline.coupon.dispatcher.CouponDispatchHandler;
import com.zhaoonline.coupon.dispatcher.UserCouponMappingHandler;
import com.zhaoonline.coupon.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 LeafCouponHelpOpenHandler {
    private CouponDispatchHandler coupenDispatcher = null;
    private UserCouponMappingHandler userCoupenMappingHandler= null;

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

    @Autowired
    public LeafCouponHelpOpenHandler(CouponDispatchHandler coupenDispatcher, UserCouponMappingHandler userCoupenMappingHandler){
        this.coupenDispatcher = coupenDispatcher;
        this.userCoupenMappingHandler =  userCoupenMappingHandler;
        activityHandler = new ActivityHandler(coupenDispatcher,userCoupenMappingHandler);
        lifeCycle.markStart();
    }

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

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

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

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

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

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

    private void getOrcacheLeafCounpens(CommonCouponEntity coupenEntity, RandomCache<String, LeafCouponEntity> leafCouppenEntityCache) {
        List<CommonCouponEntity> leafCoupens= coupenDispatcher.dispacthCoupenEntityUsingCoupen(coupenEntity);
        for(CommonCouponEntity counpen:leafCoupens){
            LeafCouponEntity leafCoupenEntity = new LeafCouponEntity();
            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 CommonCouponEntity dispacthOneLeafCoupen(CommonCouponEntity coupenEntity, RandomCache<String, LeafCouponEntity> leafCouppenEntityCache) {
        OwnerUser owner = coupenEntity.getOwnerUser();
        LeafCouponEntity unmappedLeafCoupenEntity=null;
        CommonCouponEntity 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 LeafCouponEntity randomGetCoupenFromCache(RandomCache<String,LeafCouponEntity> coupenCacheOfSeed){
        //随机获取一个红包ID
        String coupenEntityID=coupenCacheOfSeed.randomKey();
        LeafCouponEntity coupenEntity=coupenCacheOfSeed.getCache(coupenEntityID);
        return coupenEntity;
    }

}