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 \ No newline at end of file 4 \ No newline at end of file
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardLadders.java
1 package cn.fw.morax.domain.db.eval; 1 package cn.fw.morax.domain.db.eval;
2 2
3 import cn.fw.common.data.entity.BaseAuditableTimeEntity; 3 import cn.fw.common.data.entity.BaseAuditableTimeEntity;
  4 +import cn.fw.morax.domain.enums.RankOrderTypeEnum;
4 import com.baomidou.mybatisplus.annotation.TableLogic; 5 import com.baomidou.mybatisplus.annotation.TableLogic;
5 import com.baomidou.mybatisplus.annotation.TableName; 6 import com.baomidou.mybatisplus.annotation.TableName;
6 import lombok.Data; 7 import lombok.Data;
@@ -52,6 +53,11 @@ public class EvalGroupRewardLadders extends BaseAuditableTimeEntity<EvalGroupRew @@ -52,6 +53,11 @@ public class EvalGroupRewardLadders extends BaseAuditableTimeEntity<EvalGroupRew
52 private BigDecimal money; 53 private BigDecimal money;
53 54
54 /** 55 /**
  56 + * 排名顺序类型 1:正 2:负
  57 + */
  58 + private RankOrderTypeEnum rankOrderType;
  59 +
  60 + /**
55 * 封顶金额/台 61 * 封顶金额/台
56 */ 62 */
57 private BigDecimal capMoney; 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,6 +4,7 @@ import cn.fw.common.data.entity.BaseAuditableTimeEntity;
4 import cn.fw.morax.common.utils.PublicUtil; 4 import cn.fw.morax.common.utils.PublicUtil;
5 import cn.fw.morax.domain.dto.AbstractLaddersDto; 5 import cn.fw.morax.domain.dto.AbstractLaddersDto;
6 import cn.fw.morax.domain.dto.kpi.KpiGroupIndicatorLaddersDTO; 6 import cn.fw.morax.domain.dto.kpi.KpiGroupIndicatorLaddersDTO;
  7 +import cn.fw.morax.domain.enums.RankOrderTypeEnum;
7 import com.baomidou.mybatisplus.annotation.TableLogic; 8 import com.baomidou.mybatisplus.annotation.TableLogic;
8 import com.baomidou.mybatisplus.annotation.TableName; 9 import com.baomidou.mybatisplus.annotation.TableName;
9 import lombok.Data; 10 import lombok.Data;
@@ -38,6 +39,11 @@ public class EvalGroupRewardLaddersDTO extends AbstractLaddersDto implements Com @@ -38,6 +39,11 @@ public class EvalGroupRewardLaddersDTO extends AbstractLaddersDto implements Com
38 // private BigDecimal upper; 39 // private BigDecimal upper;
39 40
40 /** 41 /**
  42 + * 排名顺序类型 1:正 2:负
  43 + */
  44 + private RankOrderTypeEnum rankOrderType;
  45 +
  46 + /**
41 * 金额 47 * 金额
42 */ 48 */
43 @NotNull(message = "金额不能为空") 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,11 +3,9 @@ package cn.fw.morax.service.biz.calculator.eval.reward;
3 import cn.fw.morax.common.utils.PublicUtil; 3 import cn.fw.morax.common.utils.PublicUtil;
4 import cn.fw.morax.domain.bo.eval.EvalGroupUserShop; 4 import cn.fw.morax.domain.bo.eval.EvalGroupUserShop;
5 import cn.fw.morax.domain.db.eval.*; 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 import cn.fw.morax.service.biz.CommonService; 7 import cn.fw.morax.service.biz.CommonService;
  8 +import com.sun.org.apache.regexp.internal.RE;
11 import lombok.Getter; 9 import lombok.Getter;
12 import lombok.RequiredArgsConstructor; 10 import lombok.RequiredArgsConstructor;
13 import lombok.extern.slf4j.Slf4j; 11 import lombok.extern.slf4j.Slf4j;
@@ -77,22 +75,8 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator { @@ -77,22 +75,8 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator {
77 List<EvalGroupRewardLadders> ladders = queryRewardLadders(evalGroupRewardId); 75 List<EvalGroupRewardLadders> ladders = queryRewardLadders(evalGroupRewardId);
78 for (EvalGroupRewardLadders ladder : ladders) { 76 for (EvalGroupRewardLadders ladder : ladders) {
79 final BigDecimal money = ladder.getMoney(); 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 for (EvalGroupRewardRankLog rankLog : matchRankLogs) { 81 for (EvalGroupRewardRankLog rankLog : matchRankLogs) {
98 EvalGroupUserShop userShop = poolUserShopMap.get(rankLog.getPoolId()); 82 EvalGroupUserShop userShop = poolUserShopMap.get(rankLog.getPoolId());
@@ -115,5 +99,65 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator { @@ -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,7 +316,7 @@ public class EvalGroupBizService {
316 * @param dto 316 * @param dto
317 */ 317 */
318 public void checkTime(EvalGroupDTO dto) { 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 if (PublicUtil.isNotEmpty(dto.getId())) { 321 if (PublicUtil.isNotEmpty(dto.getId())) {
322 List<EvalGroup> evalGroups = evalGroupService.list(Wrappers.<EvalGroup>lambdaQuery() 322 List<EvalGroup> evalGroups = evalGroupService.list(Wrappers.<EvalGroup>lambdaQuery()