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 | 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() | ... | ... |