Blame view

fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardRankCalculator.java 6.27 KB
2cf8122d   姜超   feature(*): 考评指标计算
1
2
  package cn.fw.morax.service.biz.calculator.eval.reward;
  
7e8fb0fe   姜超   feature(*): 考评计算修改
3
  import cn.fw.morax.common.utils.PublicUtil;
7e8fb0fe   姜超   feature(*): 考评计算修改
4
  import cn.fw.morax.domain.bo.eval.EvalGroupUserShop;
5ff2c525   姜超   feature(*): 并列排名计算
5
  import cn.fw.morax.domain.db.eval.*;
eee77f4e   姜超   feature(*): 负数排名设置
6
  import cn.fw.morax.domain.enums.*;
5ff2c525   姜超   feature(*): 并列排名计算
7
  import cn.fw.morax.service.biz.CommonService;
c4a10f17   姜超   feature(*): 保存排名名次修改
8
  import com.baomidou.mybatisplus.core.toolkit.Wrappers;
eee77f4e   姜超   feature(*): 负数排名设置
9
  import com.sun.org.apache.regexp.internal.RE;
7e8fb0fe   姜超   feature(*): 考评计算修改
10
11
  import lombok.Getter;
  import lombok.RequiredArgsConstructor;
2cf8122d   姜超   feature(*): 考评指标计算
12
  import lombok.extern.slf4j.Slf4j;
7e8fb0fe   姜超   feature(*): 考评计算修改
13
  import org.springframework.beans.factory.annotation.Value;
7e8fb0fe   姜超   feature(*): 考评计算修改
14
  import org.springframework.data.redis.core.StringRedisTemplate;
2cf8122d   姜超   feature(*): 考评指标计算
15
  import org.springframework.stereotype.Component;
7e8fb0fe   姜超   feature(*): 考评计算修改
16
  import org.springframework.util.CollectionUtils;
2cf8122d   姜超   feature(*): 考评指标计算
17
18
  
  import java.math.BigDecimal;
7e8fb0fe   姜超   feature(*): 考评计算修改
19
  import java.math.RoundingMode;
5ff2c525   姜超   feature(*): 并列排名计算
20
21
22
  import java.util.*;
  import java.util.function.Function;
  import java.util.stream.Collectors;
2cf8122d   姜超   feature(*): 考评指标计算
23
24
25
26
27
28
29
30
  
  /**
   * @author jiangchao
   * @des: 排名正负激励
   * @date 2023/2/1 11:03
   */
  @Component
  @Slf4j
7e8fb0fe   姜超   feature(*): 考评计算修改
31
  @RequiredArgsConstructor
6bd58854   姜超   feature(*): 考评导入修改
32
  public class EvalRewardRankCalculator extends EvalRewardBaseCalculator {
2cf8122d   姜超   feature(*): 考评指标计算
33
  
5ff2c525   姜超   feature(*): 并列排名计算
34
      private final CommonService commonService;
7e8fb0fe   姜超   feature(*): 考评计算修改
35
  
2cf8122d   姜超   feature(*): 考评指标计算
36
37
38
39
40
41
      @Override
      public EvalRewardCalMethodEnum getCalMethod() {
          return EvalRewardCalMethodEnum.RANK;
      }
  
      @Override
e2386ce2   姜超   feature(*): 考评计算得分修改
42
      public BigDecimal calculate(EvalGroupUserShop param, EvalGroupReward rewardBO) {
2cf8122d   姜超   feature(*): 考评指标计算
43
44
          return null;
      }
7e8fb0fe   姜超   feature(*): 考评计算修改
45
46
  
      @Override
e2386ce2   姜超   feature(*): 考评计算得分修改
47
      public void calculateGroup(List<EvalGroupUserShop> userShops, EvalGroupReward reward) {
9f43aee0   姜超   feature(*): 计算考评修改
48
          userShops = userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList());
7e8fb0fe   姜超   feature(*): 考评计算修改
49
50
51
          if (PublicUtil.isEmpty(userShops)) {
              return;
          }
da42a3d8   姜超   feature(*): 计算考评代码优化
52
          initReward(userShops);
e2386ce2   姜超   feature(*): 考评计算得分修改
53
          final Long evalGroupRewardId = reward.getId();
e2386ce2   姜超   feature(*): 考评计算得分修改
54
          RankTypeEnum rankType = reward.getRankType();
9bac7a5e   姜超   feature(*): 判断是否命...
55
          List<EvalGroupRewardPrecondition> preconditions = queryPrecondition(evalGroupRewardId);
2188d9d0   姜超   feature(*): 修改代码格式
56
          List<EvalGroupRewardParam> params = queryProjectParam(evalGroupRewardId, ParamTypeEnum.LADDER);
7e8fb0fe   姜超   feature(*): 考评计算修改
57
58
59
60
          if (CollectionUtils.isEmpty(params)) {
              return;
          }
  
5ff2c525   姜超   feature(*): 并列排名计算
61
62
63
64
65
66
67
          //计算排名
          List<EvalGroupRewardRankLog> rankLogs = calculateRankParamValue(userShops, evalGroupRewardId, params);
          Collections.sort(rankLogs);
          commonService.calcRank(rankLogs);
          saveRankLogs(evalGroupRewardId, rankLogs, RankIndicatorTypeEnum.REWARD_COMMISSION);
          Map<Long, EvalGroupUserShop> poolUserShopMap = userShops.stream().collect(Collectors.toMap(EvalGroupUserShop::getPoolId,
                  Function.identity(), (v1, v2) -> v1));
7e8fb0fe   姜超   feature(*): 考评计算修改
68
  
5ff2c525   姜超   feature(*): 并列排名计算
69
          //计算金额
2188d9d0   姜超   feature(*): 修改代码格式
70
          final BigDecimal personCount = BigDecimal.valueOf(userShops.size());
7e8fb0fe   姜超   feature(*): 考评计算修改
71
72
73
          List<EvalGroupRewardLadders> ladders = queryRewardLadders(evalGroupRewardId);
          for (EvalGroupRewardLadders ladder : ladders) {
              final BigDecimal money = ladder.getMoney();
2188d9d0   姜超   feature(*): 修改代码格式
74
  
eee77f4e   姜超   feature(*): 负数排名设置
75
              List<EvalGroupRewardRankLog> matchRankLogs = matchRank(rankType, personCount, ladder, rankLogs);
c4a10f17   姜超   feature(*): 保存排名名次修改
76
              updateHitRankLog(matchRankLogs);
5ff2c525   姜超   feature(*): 并列排名计算
77
78
79
  
              for (EvalGroupRewardRankLog rankLog : matchRankLogs) {
                  EvalGroupUserShop userShop = poolUserShopMap.get(rankLog.getPoolId());
9bac7a5e   姜超   feature(*): 判断是否命...
80
81
82
83
84
                  boolean examined = examinePrecondition(userShop, preconditions);
                  if (!examined) {
                      userShop.setEvalGroupRewardAmount(BigDecimal.ZERO);
                      continue;
                  }
da42a3d8   姜超   feature(*): 计算考评代码优化
85
                  userShop.setEvalGroupRewardAmount(money);
5ff2c525   姜超   feature(*): 并列排名计算
86
                  BigDecimal hitCommissionValue = rankLog.getReachValue();
7e8fb0fe   姜超   feature(*): 考评计算修改
87
88
89
90
91
92
93
94
95
96
97
98
                  clearProjectHitLog(evalGroupRewardId, userShop);
                  saveProjectHitLog(evalGroupRewardId, userShop, log -> {
                      log.setRewardValue(money);
                      log.setEvalGroupRewardLaddersId(ladder.getId());
                      log.setHitLadderValue(hitCommissionValue);
                      log.setHitCommissionValue(hitCommissionValue);
                  });
              }
          }
  
      }
  
eee77f4e   姜超   feature(*): 负数排名设置
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
      /**
       * 匹配排名
       *
       * @param rankType
       * @param personCount
       * @param ladder
       * @param rankLogs
       * @return
       */
      public List<EvalGroupRewardRankLog> matchRank(final RankTypeEnum rankType,
                                                        final BigDecimal personCount,
                                                        EvalGroupRewardLadders ladder,
                                                        List<EvalGroupRewardRankLog> rankLogs) {
          BigDecimal lower = ladder.getLower();
          BigDecimal upper = ladder.getUpper();
          RankOrderTypeEnum rankOrderType = ladder.getRankOrderType();
          Integer startIndex ;
          Integer endIndex ;
  
          //百分比
          if (RankTypeEnum.PERCENT.equals(rankType)) {
              if (RankOrderTypeEnum.NEGATIVE.equals(rankOrderType)) {
                  lower = BigDecimal.ONE.subtract(ladder.getUpper());
                  upper = BigDecimal.ONE.subtract(ladder.getLower());
              }
              startIndex = lower.multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue();
              endIndex = upper.multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue();
  
              if (startIndex > endIndex) {
                  return new ArrayList<>();
              }
  
              Integer finalEndIndex = endIndex,finalStartIndex = startIndex;
              List<EvalGroupRewardRankLog> matchRankLogs = rankLogs.stream().filter(rankLog -> {
                  return rankLog.getRank() > finalStartIndex && rankLog.getRank() <= finalEndIndex;
              }).collect(Collectors.toList());
              return matchRankLogs;
          }
  
          //名次
          if (RankOrderTypeEnum.NEGATIVE.equals(rankOrderType)) {
              startIndex = personCount.subtract(upper).intValue() + 1;
              endIndex = personCount.subtract(lower).intValue() + 1;
          } else {
              startIndex = ladder.getLower().intValue();
              endIndex = ladder.getUpper().intValue();
          }
  
          if (startIndex > endIndex) {
              return new ArrayList<>();
          }
  
          Integer finalEndIndex = endIndex,finalStartIndex = startIndex;
          List<EvalGroupRewardRankLog> matchRankLogs = rankLogs.stream().filter(rankLog -> {
              return rankLog.getRank() >= finalStartIndex && rankLog.getRank() <= finalEndIndex;
          }).collect(Collectors.toList());
  
          return matchRankLogs;
      }
  
7e8fb0fe   姜超   feature(*): 考评计算修改
159
  
2cf8122d   姜超   feature(*): 考评指标计算
160
  }