EvalRewardProportionCalculator.java 3.75 KB
package cn.fw.morax.service.biz.calculator.eval.reward;

import cn.fw.common.cache.locker.DistributedLocker;
import cn.fw.morax.common.utils.PublicUtil;
import cn.fw.morax.domain.bo.eval.EvalGroupUserShop;
import cn.fw.morax.domain.db.eval.EvalGroupReward;
import cn.fw.morax.domain.db.eval.EvalGroupRewardParam;
import cn.fw.morax.domain.db.eval.EvalGroupRewardPrecondition;
import cn.fw.morax.domain.enums.EvalRewardCalMethodEnum;
import cn.fw.morax.domain.enums.ParamTypeEnum;
import cn.fw.morax.service.data.eval.EvalGroupService;
import cn.fw.morax.service.data.eval.EvalGroupUserService;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author jiangchao
 * @des: 总金额占比
 * @date 2023/2/1 11:03
 */
@Component
@Slf4j
@RequiredArgsConstructor
public class EvalRewardProportionCalculator extends EvalRewardBaseCalculator {

    @Override
    public EvalRewardCalMethodEnum getCalMethod() {
        return EvalRewardCalMethodEnum.TOTAL_PROPORTION;
    }

    @Override
    public BigDecimal calculate(EvalGroupUserShop param, EvalGroupReward rewardBO) {
        return null;
    }

    @Override
    public void calculateGroup(List<EvalGroupUserShop> userShops, EvalGroupReward reward) {
        if (PublicUtil.isEmpty(userShops)) {
            return;
        }

        initReward(userShops);
        final Long evalGroupRewardId = reward.getId();
        List<EvalGroupRewardPrecondition> preconditions = queryPrecondition(evalGroupRewardId);
        BigDecimal money = reward.getMoney();
        List<EvalGroupRewardParam> params = queryProjectParam(evalGroupRewardId, ParamTypeEnum.COMMISSION);
        if (CollectionUtils.isEmpty(params)) {
            return;
        }

        BigDecimal totalCommissionValue = BigDecimal.ZERO;
        Map<Long, BigDecimal> referValueMap = new HashMap<>();
        for (EvalGroupUserShop userShop : userShops) {
            Long poolId = userShop.getPoolId();
            BigDecimal commissionValue = calculateParamValue(userShop, params);

            totalCommissionValue = totalCommissionValue.add(commissionValue);
            referValueMap.put(poolId, commissionValue);
        }

        for (EvalGroupUserShop userShop : userShops) {
            boolean examined = examinePrecondition(userShop, preconditions);

            BigDecimal commissionValue = referValueMap.getOrDefault(userShop.getPoolId(), BigDecimal.ZERO);

            BigDecimal proportion = BigDecimal.ZERO;
            BigDecimal rewardValue = BigDecimal.ZERO;
            if (totalCommissionValue.compareTo(BigDecimal.ZERO) > 0) {
                proportion = commissionValue.divide(totalCommissionValue, 4, RoundingMode.DOWN);
                rewardValue = proportion.multiply(money).divide(BigDecimal.ONE, 2, RoundingMode.DOWN);
            }

            //未通过条件,奖惩为0,保存日志
            if (!examined) {
                rewardValue = BigDecimal.ZERO;
            }

            userShop.setEvalGroupRewardAmount(rewardValue);
            clearProjectHitLog(evalGroupRewardId, userShop);
            BigDecimal finalRewardValue = rewardValue;
            BigDecimal finalProportion = proportion;
            saveProjectHitLog(evalGroupRewardId, userShop, log -> {
                log.setRewardValue(finalRewardValue);
                log.setProportionValue(finalProportion);
                log.setHitCommissionValue(commissionValue);
            });
        }
    }

}