AverageStrategy.java 2.19 KB
package com.zhaoonline.coupen.generator.distribute;

import com.zhaoonline.coupen.bean.CommonCoupenEntity;
import com.zhaoonline.coupen.bean.CommonCoupenSeed;
import com.zhaoonline.coupen.bean.CoupenContext;
import com.zhaoonline.coupen.utils.Utils;
import org.springframework.util.ObjectUtils;

import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by ZhaoOnline<br/>
 * User: yangyoupeng<br/>
 * Date: 2016/12/14<br/>
 * Time: 19:15<br/>
 * Description:总金额平均分配
 */
public class AverageStrategy implements  DistributeStrategy{
    private static final String STRATEGY_NAME="avr";
    @Override
    public CoupenContext<CommonCoupenEntity,CommonCoupenSeed> distribute(@NotNull CommonCoupenSeed seed) {
        if(ObjectUtils.isEmpty(seed)){
            return CoupenContext.empty();
        }
        BigDecimal amountPerCoupen =  this.amountPerCoupen(seed);
        Integer expectCount=seed.getCoupenCount();
        List<CommonCoupenEntity> newCreatedCoupens=new ArrayList<CommonCoupenEntity>(expectCount);
        for(int i=0 ;i<expectCount.intValue();i++){
            CommonCoupenEntity coupenEntity =new CommonCoupenEntity();
            coupenEntity.setCoupenID(generateCoupenID());
            coupenEntity.setSeed(seed);
            coupenEntity.setAmount(amountPerCoupen);
            newCreatedCoupens.add(coupenEntity);
        }
        CoupenContext<CommonCoupenEntity,CommonCoupenSeed> coupenContext=new CoupenContext<CommonCoupenEntity,CommonCoupenSeed>();
        coupenContext.setSeed(seed);
        coupenContext.setCoupens(newCreatedCoupens);
        return coupenContext;
    }

    @Override
    public String distributeName() {
        return STRATEGY_NAME;
    }

    private String generateCoupenID(){
       return  Utils.getRandomForDate(STRATEGY_NAME);
    }


    /**计算每个红包的金额
     * @param seed
     * @return
     */
    public BigDecimal amountPerCoupen(CommonCoupenSeed seed){
        Integer  expectCoupneCount=seed.getCoupenCount();
        BigDecimal totalAmount=seed.getTotalAmount();
        return  totalAmount.divide(new BigDecimal(expectCoupneCount),3,BigDecimal.ROUND_HALF_UP);
    }
}