Commit eee77f4e26f06504b05d0baa9e184193cf2c11a8

Authored by 姜超
1 parent 5ff2c525

feature(*): 负数排名设置

负数排名设置
doc/2023_update.sql 0 → 100644
  1 +-- 2023年3月7日
  2 +ALTER TABLE `fw_morax`.`eval_group_reward_ladders`
  3 + ADD COLUMN `rank_order_type` tinyint(4) NULL DEFAULT 1 COMMENT '排名顺序类型 1:正 2:负' AFTER `upper`;
0 4 \ No newline at end of file
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardLadders.java
1 1 package cn.fw.morax.domain.db.eval;
2 2  
3 3 import cn.fw.common.data.entity.BaseAuditableTimeEntity;
  4 +import cn.fw.morax.domain.enums.RankOrderTypeEnum;
4 5 import com.baomidou.mybatisplus.annotation.TableLogic;
5 6 import com.baomidou.mybatisplus.annotation.TableName;
6 7 import lombok.Data;
... ... @@ -52,6 +53,11 @@ public class EvalGroupRewardLadders extends BaseAuditableTimeEntity<EvalGroupRew
52 53 private BigDecimal money;
53 54  
54 55 /**
  56 + * 排名顺序类型 1:正 2:负
  57 + */
  58 + private RankOrderTypeEnum rankOrderType;
  59 +
  60 + /**
55 61 * 封顶金额/台
56 62 */
57 63 private BigDecimal capMoney;
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/dto/eval/EvalGroupRewardLaddersDTO.java
... ... @@ -4,6 +4,7 @@ import cn.fw.common.data.entity.BaseAuditableTimeEntity;
4 4 import cn.fw.morax.common.utils.PublicUtil;
5 5 import cn.fw.morax.domain.dto.AbstractLaddersDto;
6 6 import cn.fw.morax.domain.dto.kpi.KpiGroupIndicatorLaddersDTO;
  7 +import cn.fw.morax.domain.enums.RankOrderTypeEnum;
7 8 import com.baomidou.mybatisplus.annotation.TableLogic;
8 9 import com.baomidou.mybatisplus.annotation.TableName;
9 10 import lombok.Data;
... ... @@ -38,6 +39,11 @@ public class EvalGroupRewardLaddersDTO extends AbstractLaddersDto implements Com
38 39 // private BigDecimal upper;
39 40  
40 41 /**
  42 + * 排名顺序类型 1:正 2:负
  43 + */
  44 + private RankOrderTypeEnum rankOrderType;
  45 +
  46 + /**
41 47 * 金额
42 48 */
43 49 @NotNull(message = "金额不能为空")
... ...
fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/RankOrderTypeEnum.java 0 → 100644
  1 +package cn.fw.morax.domain.enums;
  2 +
  3 +import com.baomidou.mybatisplus.core.enums.IEnum;
  4 +import com.fasterxml.jackson.annotation.JsonCreator;
  5 +import com.fasterxml.jackson.annotation.JsonValue;
  6 +import lombok.Getter;
  7 +
  8 +/**
  9 + * 数据范围范围类型
  10 + *
  11 + * @author kurisu
  12 + */
  13 +public enum RankOrderTypeEnum implements IEnum<Integer> {
  14 + /**
  15 + * 排名顺序类型 1:正 2:负
  16 + */
  17 + POSITIVE(1, "正数"),
  18 + NEGATIVE(2, "负数"),
  19 + ;
  20 +
  21 + /**
  22 + * 值
  23 + */
  24 + private final Integer value;
  25 + /**
  26 + * 名称
  27 + */
  28 + @Getter
  29 + private final String name;
  30 +
  31 + RankOrderTypeEnum(final Integer value, final String name) {
  32 + this.value = value;
  33 + this.name = name;
  34 + }
  35 +
  36 + /**
  37 + * 根据枚举值获取枚举对象
  38 + */
  39 + @JsonCreator
  40 + public static RankOrderTypeEnum ofValue(final Integer value) {
  41 + for (final RankOrderTypeEnum _enum : RankOrderTypeEnum.values()) {
  42 + if (_enum.value.equals(value)) {
  43 + return _enum;
  44 + }
  45 + }
  46 + return null;
  47 + }
  48 +
  49 + /**
  50 + * 获取值
  51 + *
  52 + * @return 值
  53 + */
  54 + @JsonValue
  55 + @Override
  56 + public Integer getValue() {
  57 + return value;
  58 + }
  59 +
  60 + /**
  61 + * 获取描述
  62 + *
  63 + * @return 值
  64 + */
  65 + @JsonCreator
  66 + public static String getNameByVale(final Integer value) {
  67 + for (final RankOrderTypeEnum _enum : RankOrderTypeEnum.values()) {
  68 + if (_enum.value.equals(value)) {
  69 + return _enum.getName();
  70 + }
  71 + }
  72 + return "";
  73 + }
  74 +}
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardRankCalculator.java
... ... @@ -3,11 +3,9 @@ package cn.fw.morax.service.biz.calculator.eval.reward;
3 3 import cn.fw.morax.common.utils.PublicUtil;
4 4 import cn.fw.morax.domain.bo.eval.EvalGroupUserShop;
5 5 import cn.fw.morax.domain.db.eval.*;
6   -import cn.fw.morax.domain.enums.EvalRewardCalMethodEnum;
7   -import cn.fw.morax.domain.enums.ParamTypeEnum;
8   -import cn.fw.morax.domain.enums.RankIndicatorTypeEnum;
9   -import cn.fw.morax.domain.enums.RankTypeEnum;
  6 +import cn.fw.morax.domain.enums.*;
10 7 import cn.fw.morax.service.biz.CommonService;
  8 +import com.sun.org.apache.regexp.internal.RE;
11 9 import lombok.Getter;
12 10 import lombok.RequiredArgsConstructor;
13 11 import lombok.extern.slf4j.Slf4j;
... ... @@ -77,22 +75,8 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator {
77 75 List<EvalGroupRewardLadders> ladders = queryRewardLadders(evalGroupRewardId);
78 76 for (EvalGroupRewardLadders ladder : ladders) {
79 77 final BigDecimal money = ladder.getMoney();
80   - Integer startIndex = ladder.getLower().intValue() - 1;
81   - Integer endIndex = ladder.getUpper().intValue();
82 78  
83   - if (RankTypeEnum.PERCENT.equals(rankType)) {
84   - startIndex = ladder.getLower().multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue();
85   - endIndex = ladder.getUpper().multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue();
86   - }
87   -
88   - if (startIndex > endIndex) {
89   - continue;
90   - }
91   -
92   - Integer _startIndex = startIndex, _endIndex = endIndex;;
93   - List<EvalGroupRewardRankLog> matchRankLogs = rankLogs.stream().filter(rankLog -> {
94   - return rankLog.getRank() > _startIndex && rankLog.getRank() <= _endIndex;
95   - }).collect(Collectors.toList());
  79 + List<EvalGroupRewardRankLog> matchRankLogs = matchRank(rankType, personCount, ladder, rankLogs);
96 80  
97 81 for (EvalGroupRewardRankLog rankLog : matchRankLogs) {
98 82 EvalGroupUserShop userShop = poolUserShopMap.get(rankLog.getPoolId());
... ... @@ -115,5 +99,65 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator {
115 99  
116 100 }
117 101  
  102 + /**
  103 + * 匹配排名
  104 + *
  105 + * @param rankType
  106 + * @param personCount
  107 + * @param ladder
  108 + * @param rankLogs
  109 + * @return
  110 + */
  111 + public List<EvalGroupRewardRankLog> matchRank(final RankTypeEnum rankType,
  112 + final BigDecimal personCount,
  113 + EvalGroupRewardLadders ladder,
  114 + List<EvalGroupRewardRankLog> rankLogs) {
  115 + BigDecimal lower = ladder.getLower();
  116 + BigDecimal upper = ladder.getUpper();
  117 + RankOrderTypeEnum rankOrderType = ladder.getRankOrderType();
  118 + Integer startIndex ;
  119 + Integer endIndex ;
  120 +
  121 + //百分比
  122 + if (RankTypeEnum.PERCENT.equals(rankType)) {
  123 + if (RankOrderTypeEnum.NEGATIVE.equals(rankOrderType)) {
  124 + lower = BigDecimal.ONE.subtract(ladder.getUpper());
  125 + upper = BigDecimal.ONE.subtract(ladder.getLower());
  126 + }
  127 + startIndex = lower.multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue();
  128 + endIndex = upper.multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue();
  129 +
  130 + if (startIndex > endIndex) {
  131 + return new ArrayList<>();
  132 + }
  133 +
  134 + Integer finalEndIndex = endIndex,finalStartIndex = startIndex;
  135 + List<EvalGroupRewardRankLog> matchRankLogs = rankLogs.stream().filter(rankLog -> {
  136 + return rankLog.getRank() > finalStartIndex && rankLog.getRank() <= finalEndIndex;
  137 + }).collect(Collectors.toList());
  138 + return matchRankLogs;
  139 + }
  140 +
  141 + //名次
  142 + if (RankOrderTypeEnum.NEGATIVE.equals(rankOrderType)) {
  143 + startIndex = personCount.subtract(upper).intValue() + 1;
  144 + endIndex = personCount.subtract(lower).intValue() + 1;
  145 + } else {
  146 + startIndex = ladder.getLower().intValue();
  147 + endIndex = ladder.getUpper().intValue();
  148 + }
  149 +
  150 + if (startIndex > endIndex) {
  151 + return new ArrayList<>();
  152 + }
  153 +
  154 + Integer finalEndIndex = endIndex,finalStartIndex = startIndex;
  155 + List<EvalGroupRewardRankLog> matchRankLogs = rankLogs.stream().filter(rankLog -> {
  156 + return rankLog.getRank() >= finalStartIndex && rankLog.getRank() <= finalEndIndex;
  157 + }).collect(Collectors.toList());
  158 +
  159 + return matchRankLogs;
  160 + }
  161 +
118 162  
119 163 }
... ...
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupBizService.java
... ... @@ -316,7 +316,7 @@ public class EvalGroupBizService {
316 316 * @param dto
317 317 */
318 318 public void checkTime(EvalGroupDTO dto) {
319   - BV.isTrue(dto.getBeginTime().isBefore(dto.getOverTime()), "考评组【" + dto.getName()+ "】生效时间必须在结束时间之前");
  319 +// BV.isTrue(dto.getBeginTime().isBefore(dto.getOverTime()), "考评组【" + dto.getName()+ "】生效时间必须在结束时间之前");
320 320  
321 321 if (PublicUtil.isNotEmpty(dto.getId())) {
322 322 List<EvalGroup> evalGroups = evalGroupService.list(Wrappers.<EvalGroup>lambdaQuery()
... ...