diff --git a/doc/2023_update.sql b/doc/2023_update.sql new file mode 100644 index 0000000..ebc9ac4 --- /dev/null +++ b/doc/2023_update.sql @@ -0,0 +1,3 @@ +-- 2023年3月7日 +ALTER TABLE `fw_morax`.`eval_group_reward_ladders` + ADD COLUMN `rank_order_type` tinyint(4) NULL DEFAULT 1 COMMENT '排名顺序类型 1:正 2:负' AFTER `upper`; \ No newline at end of file diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardLadders.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardLadders.java index df8f830..544afd2 100644 --- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardLadders.java +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardLadders.java @@ -1,6 +1,7 @@ package cn.fw.morax.domain.db.eval; import cn.fw.common.data.entity.BaseAuditableTimeEntity; +import cn.fw.morax.domain.enums.RankOrderTypeEnum; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -52,6 +53,11 @@ public class EvalGroupRewardLadders extends BaseAuditableTimeEntity { + /** + * 排名顺序类型 1:正 2:负 + */ + POSITIVE(1, "正数"), + NEGATIVE(2, "负数"), + ; + + /** + * 值 + */ + private final Integer value; + /** + * 名称 + */ + @Getter + private final String name; + + RankOrderTypeEnum(final Integer value, final String name) { + this.value = value; + this.name = name; + } + + /** + * 根据枚举值获取枚举对象 + */ + @JsonCreator + public static RankOrderTypeEnum ofValue(final Integer value) { + for (final RankOrderTypeEnum _enum : RankOrderTypeEnum.values()) { + if (_enum.value.equals(value)) { + return _enum; + } + } + return null; + } + + /** + * 获取值 + * + * @return 值 + */ + @JsonValue + @Override + public Integer getValue() { + return value; + } + + /** + * 获取描述 + * + * @return 值 + */ + @JsonCreator + public static String getNameByVale(final Integer value) { + for (final RankOrderTypeEnum _enum : RankOrderTypeEnum.values()) { + if (_enum.value.equals(value)) { + return _enum.getName(); + } + } + return ""; + } +} diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardRankCalculator.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardRankCalculator.java index 611f5aa..9cf5535 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardRankCalculator.java +++ b/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; import cn.fw.morax.common.utils.PublicUtil; import cn.fw.morax.domain.bo.eval.EvalGroupUserShop; import cn.fw.morax.domain.db.eval.*; -import cn.fw.morax.domain.enums.EvalRewardCalMethodEnum; -import cn.fw.morax.domain.enums.ParamTypeEnum; -import cn.fw.morax.domain.enums.RankIndicatorTypeEnum; -import cn.fw.morax.domain.enums.RankTypeEnum; +import cn.fw.morax.domain.enums.*; import cn.fw.morax.service.biz.CommonService; +import com.sun.org.apache.regexp.internal.RE; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -77,22 +75,8 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator { List ladders = queryRewardLadders(evalGroupRewardId); for (EvalGroupRewardLadders ladder : ladders) { final BigDecimal money = ladder.getMoney(); - Integer startIndex = ladder.getLower().intValue() - 1; - Integer endIndex = ladder.getUpper().intValue(); - if (RankTypeEnum.PERCENT.equals(rankType)) { - startIndex = ladder.getLower().multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue(); - endIndex = ladder.getUpper().multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue(); - } - - if (startIndex > endIndex) { - continue; - } - - Integer _startIndex = startIndex, _endIndex = endIndex;; - List matchRankLogs = rankLogs.stream().filter(rankLog -> { - return rankLog.getRank() > _startIndex && rankLog.getRank() <= _endIndex; - }).collect(Collectors.toList()); + List matchRankLogs = matchRank(rankType, personCount, ladder, rankLogs); for (EvalGroupRewardRankLog rankLog : matchRankLogs) { EvalGroupUserShop userShop = poolUserShopMap.get(rankLog.getPoolId()); @@ -115,5 +99,65 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator { } + /** + * 匹配排名 + * + * @param rankType + * @param personCount + * @param ladder + * @param rankLogs + * @return + */ + public List matchRank(final RankTypeEnum rankType, + final BigDecimal personCount, + EvalGroupRewardLadders ladder, + List 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 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 matchRankLogs = rankLogs.stream().filter(rankLog -> { + return rankLog.getRank() >= finalStartIndex && rankLog.getRank() <= finalEndIndex; + }).collect(Collectors.toList()); + + return matchRankLogs; + } + } diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupBizService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupBizService.java index b62196e..05b7181 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupBizService.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupBizService.java @@ -316,7 +316,7 @@ public class EvalGroupBizService { * @param dto */ public void checkTime(EvalGroupDTO dto) { - BV.isTrue(dto.getBeginTime().isBefore(dto.getOverTime()), "考评组【" + dto.getName()+ "】生效时间必须在结束时间之前"); +// BV.isTrue(dto.getBeginTime().isBefore(dto.getOverTime()), "考评组【" + dto.getName()+ "】生效时间必须在结束时间之前"); if (PublicUtil.isNotEmpty(dto.getId())) { List evalGroups = evalGroupService.list(Wrappers.lambdaQuery()