Commit eee77f4e26f06504b05d0baa9e184193cf2c11a8
1 parent
5ff2c525
feature(*): 负数排名设置
负数排名设置
Showing
6 changed files
with
153 additions
and
20 deletions
doc/2023_update.sql
0 → 100644
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() |