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 userShops, EvalGroupReward reward) { if (PublicUtil.isEmpty(userShops)) { return; } initReward(userShops); final Long evalGroupRewardId = reward.getId(); List preconditions = queryPrecondition(evalGroupRewardId); BigDecimal money = reward.getMoney(); List params = queryProjectParam(evalGroupRewardId, ParamTypeEnum.COMMISSION); if (CollectionUtils.isEmpty(params)) { return; } BigDecimal totalCommissionValue = BigDecimal.ZERO; Map 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); }); } } }