diff --git a/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRewardRankLogDao.java b/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRewardRankLogDao.java new file mode 100644 index 0000000..44d2db0 --- /dev/null +++ b/fw-morax-dao/src/main/java/cn/fw/morax/dao/eval/EvalGroupRewardRankLogDao.java @@ -0,0 +1,18 @@ +package cn.fw.morax.dao.eval; + + +import cn.fw.morax.domain.db.eval.EvalGroupRewardRankLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 考评指标达成目标记录 Mapper 接口 + *

+ * + * @author jiangchao + * @since 2022-12-09 + */ +public interface EvalGroupRewardRankLogDao extends BaseMapper { + + +} diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardRankLog.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardRankLog.java new file mode 100644 index 0000000..abd565a --- /dev/null +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupRewardRankLog.java @@ -0,0 +1,80 @@ +package cn.fw.morax.domain.db.eval; + +import cn.fw.common.data.entity.BaseAuditableTimeEntity; +import cn.fw.morax.domain.dto.eval.EvalGroupIndicatorPreconditionLaddersDTO; +import cn.fw.morax.domain.enums.EvalScopeEnum; +import cn.fw.morax.domain.enums.IndicatorTypeEnum; +import cn.fw.morax.domain.enums.RankIndicatorTypeEnum; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + *

+ * 奖惩排名日志 + *

+ * + * @author jiangchao + * @since 2022-12-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName(autoResultMap = true) +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class EvalGroupRewardRankLog extends BaseAuditableTimeEntity + implements Comparable{ + + private static final long serialVersionUID = 1L; + + /** + * 员工id + */ + private Long poolId; + + /** + * 考评范围; 1:门店考评 2:人员考评 + */ + private EvalScopeEnum scopeType; + + /** + * 考评奖惩 前置条件 配置id + */ + private Long referId; + /** + * 指标类型 1.奖惩提成 2.前置条件指标 + */ + private RankIndicatorTypeEnum targetType; + /** + * 原始值 + */ + private BigDecimal value; + /** + * 达成目标 + */ + private BigDecimal reachValue; + /** + * 排名 + */ + private Integer rank; + + /** + * 数据日期 + */ + private LocalDate dataDate; + + /** + * 集团 + */ + private Long groupId; + + private Boolean yn; + + @Override + public int compareTo(EvalGroupRewardRankLog other) { + return other.reachValue.compareTo(this.reachValue); + } +} diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/RankIndicatorTypeEnum.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/RankIndicatorTypeEnum.java new file mode 100644 index 0000000..ac14514 --- /dev/null +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/enums/RankIndicatorTypeEnum.java @@ -0,0 +1,74 @@ +package cn.fw.morax.domain.enums; + +import com.baomidou.mybatisplus.core.enums.IEnum; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; + +/** + * 指标类型 + * + * @author kurisu + */ +public enum RankIndicatorTypeEnum implements IEnum { + /** + * 指标类型 1.奖惩提成 2.前置条件指标 + */ + REWARD_COMMISSION(1, "奖惩提成"), + PRE(2, "前置条件指标"), + ; + + /** + * 值 + */ + private final Integer value; + /** + * 名称 + */ + @Getter + private final String name; + + RankIndicatorTypeEnum(final Integer value, final String name) { + this.value = value; + this.name = name; + } + + /** + * 根据枚举值获取枚举对象 + */ + @JsonCreator + public static RankIndicatorTypeEnum ofValue(final Integer value) { + for (final RankIndicatorTypeEnum _enum : RankIndicatorTypeEnum.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 RankIndicatorTypeEnum _enum : RankIndicatorTypeEnum.values()) { + if (_enum.value.equals(value)) { + return _enum.getName(); + } + } + return ""; + } +} diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardRankLogVO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardRankLogVO.java new file mode 100644 index 0000000..c7e6a2d --- /dev/null +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/vo/eval/EvalGroupRewardRankLogVO.java @@ -0,0 +1,87 @@ +package cn.fw.morax.domain.vo.eval; + +import cn.fw.morax.common.constant.Constant; +import cn.fw.morax.common.utils.PublicUtil; +import cn.fw.morax.domain.enums.DataTypeEnum; +import cn.fw.morax.domain.enums.EvalScopeEnum; +import cn.fw.morax.domain.enums.RankIndicatorTypeEnum; +import cn.fw.morax.domain.enums.TargetTypeEnum; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + *

+ * 奖惩排名日志 + *

+ * + * @author jiangchao + * @since 2022-12-13 + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class EvalGroupRewardRankLogVO { + + private static final long serialVersionUID = 1L; + /** + * id + */ + private Long id; + + /** + * 员工id + */ + private Long poolId; + + /** + * 考评范围; 1:门店考评 2:人员考评 + */ + private EvalScopeEnum scopeType; + + /** + * 考评奖惩 前置条件 配置id + */ + private Long referId; + /** + * 指标类型 1.奖惩提成 2.前置条件指标 + */ + private RankIndicatorTypeEnum targetType; + /** + * 原始值 + */ + private BigDecimal value; + /** + * 达成目标 + */ + private BigDecimal reachValue; + /** + * 排名 + */ + private Integer rank; + + /** + * 数据日期 + */ + private LocalDate dataDate; + + /** + * 集团 + */ + private Long groupId; + + /** + * 转换为百分数展示 + */ + public void convertValueToPercent(DataTypeEnum dataType, TargetTypeEnum targetType){ + if (DataTypeEnum.RATIO.equals(dataType)) { + this.setValue(this.getValue().multiply(Constant.ONE_HUNDRED)); + } + //有目标 + if (! TargetTypeEnum.NO.equals(targetType)) { + this.setReachValue(this.getReachValue().multiply(Constant.ONE_HUNDRED)); + } + } + +} diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalPoolController.java b/fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalPoolController.java index 4197fc6..c9a8bf3 100644 --- a/fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalPoolController.java +++ b/fw-morax-server/src/main/java/cn/fw/morax/server/controller/app/EvalPoolController.java @@ -31,9 +31,11 @@ import java.time.YearMonth; import java.time.temporal.ChronoField; import java.time.temporal.TemporalAdjuster; import java.time.temporal.TemporalAdjusters; +import java.util.List; import java.util.Objects; import java.util.Set; +import static cn.fw.common.businessvalidator.Validator.BV; import static cn.fw.common.web.util.ResultBuilder.success; /** @@ -195,6 +197,36 @@ public class EvalPoolController { return success(evalGroupPoolService.queryIndicatorRank(dto, EvalScopeEnum.SHOP)); } + /** + * 门店、人员考评条件指标排名 + * + * @param preconditionId + * @param dataDate + * @return + */ + @GetMapping("/reward-cond-rank") + @ControllerMethod("门店、人员考评条件指标排名") + public Message> queryRewardCondRank(Long preconditionId, + @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) { + return success(evalGroupPoolService.getRewardCondRankLogs(preconditionId, dataDate)); + } + + /** + * 门店、人员考评提成指标排名 + * + * @param commissionId + * @param dataDate + * @return + */ + @GetMapping("/reward-commission-rank") + @ControllerMethod("门店、人员考评提成指标排名") + public Message> queryRewardCommissionRank(Long commissionId, + @NotNull(message = "日期不能为空") @RequestParam("dataDate") LocalDate dataDate) { + return success(evalGroupPoolService.getRewardCondRankLogs(commissionId, dataDate)); + } + + + /** * 门店考评池列表 diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/CommonService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/CommonService.java index 472b63f..7772374 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/CommonService.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/CommonService.java @@ -6,6 +6,7 @@ import cn.fw.morax.common.constant.Constant; import cn.fw.morax.common.utils.ExcelDataUtil; import cn.fw.morax.common.utils.PublicUtil; import cn.fw.morax.domain.db.SettingDraft; +import cn.fw.morax.domain.db.eval.EvalGroupRewardRankLog; import cn.fw.morax.domain.db.eval.EvalIndicatorValue; import cn.fw.morax.domain.db.kpi.IndicatorUserValue; import cn.fw.morax.domain.db.kpi.KpiGroup; @@ -15,6 +16,7 @@ import cn.fw.morax.domain.enums.IndicatorValueTypeEnum; import cn.fw.morax.domain.enums.SettingDraftStatusEnum; import cn.fw.morax.domain.enums.SettingDraftTypeEnum; import cn.fw.morax.domain.vo.kpi.IndicatorUserValueVO; +import cn.fw.morax.domain.vo.kpi.KpiIndicatorRankStaffVO; import cn.fw.morax.rpc.ehr.EhrRpcService; import cn.fw.morax.rpc.ehr.dto.StaffBaseInfoDTO; import cn.fw.morax.service.data.SettingDraftService; @@ -368,4 +370,27 @@ public class CommonService { return settingDrafts; } + /** + * 设置排名序号 + * + * @return + */ + public void calcRank(List rankLogs) { + int rank = 1; + BigDecimal lastIndicatorValue = null; + for (EvalGroupRewardRankLog rankLog : rankLogs) { + //初始化 + if (PublicUtil.isEmpty(lastIndicatorValue)) { + rankLog.setRank(rank); + lastIndicatorValue = rankLog.getReachValue(); + continue; + } + if (lastIndicatorValue.compareTo(rankLog.getReachValue()) != 0) { + rank++; + } + rankLog.setRank(rank); + lastIndicatorValue = rankLog.getReachValue(); + } + } + } diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardBaseCalculator.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardBaseCalculator.java index 1b0352d..54235ba 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardBaseCalculator.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardBaseCalculator.java @@ -6,12 +6,15 @@ import cn.fw.morax.domain.bo.eval.EvalGroupUserShop; import cn.fw.morax.domain.db.eval.*; import cn.fw.morax.domain.db.kpi.IndicatorUserValue; import cn.fw.morax.domain.enums.*; +import cn.fw.morax.service.biz.CommonService; import cn.fw.morax.service.biz.calculator.Calculator; import cn.fw.morax.service.data.eval.*; import cn.fw.morax.service.data.kpi.IndicatorUserValueService; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.google.common.collect.Lists; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -29,7 +32,6 @@ import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; import java.util.function.Function; import java.util.stream.Collectors; @@ -47,6 +49,8 @@ import java.util.stream.Collectors; public abstract class EvalRewardBaseCalculator implements Calculator { @Autowired + protected EvalGroupRewardRankLogService evalGroupRewardRankLogService; + @Autowired protected EvalGroupRewardHitLogService evalGroupRewardHitLogService; @Autowired protected EvalGroupRewardPreconditionHitLogService evalGroupRewardPreconditionHitLogService; @@ -68,6 +72,8 @@ public abstract class EvalRewardBaseCalculator implements Calculator zSetOps = stringRedisTemplate.boundZSetOps(key); - stringRedisTemplate.expireAt(key, DateUtil.localDateTime2Date(LocalDateTime.now().plus(2L, ChronoUnit.HOURS))); - for (EvalGroupUserShop userShop : userShops) { - final BigDecimal indicatorValue = queryValue(userShop, precondition.getCodeType(), indicatorCode).orElse(BigDecimal.ZERO); - BigDecimal reachValue = indicatorValue; - if (!TargetTypeEnum.NO.equals(targetType)) { - reachValue = calculateTargetValue(targetCalcType, targetValue, indicatorValue); - } - saveTargetHitLog(userShop, preconditionId, IndicatorTypeEnum.PRE, indicatorValue, reachValue); - zSetOps.add(userShop.getPoolId().toString(), reachValue.doubleValue()); - } + //计算排名 + List rankLogs = calculateRankPreconditionValue(userShops, precondition); + Collections.sort(rankLogs); + commonService.calcRank(rankLogs); + saveRankLogs(preconditionId, rankLogs, RankIndicatorTypeEnum.PRE); + Map poolUserShopMap = userShops.stream().collect(Collectors.toMap(EvalGroupUserShop::getPoolId, + Function.identity(), (v1, v2) -> v1)); if (startIndex > endIndex) { continue; } - Map userShopMap = userShops.stream().collect(Collectors.toMap(EvalGroupUserShop::getPoolId, Function.identity(), (v1, v2) -> v1)); - Set> referIdStrs = zSetOps.reverseRangeWithScores(startIndex, endIndex); + Integer _startIndex = startIndex, _endIndex = endIndex;; + List matchRankLogs = rankLogs.stream().filter(rankLog -> { + return rankLog.getRank() > _startIndex && rankLog.getRank() <= _endIndex; + }).collect(Collectors.toList()); + AtomicInteger rank = new AtomicInteger(0); - referIdStrs.stream().forEach(stringTypedTuple -> { - EvalGroupUserShop userShop = userShopMap.get(Long.parseLong(stringTypedTuple.getValue())); + for (EvalGroupRewardRankLog rankLog : matchRankLogs) { + EvalGroupUserShop userShop = poolUserShopMap.get(rankLog.getPoolId()); if (PublicUtil.isNotEmpty(userShop)) { List meetRankCondIds = Optional.ofNullable(userShop.getMeetRankCondIds()).orElse(new ArrayList<>()); meetRankCondIds.add(preconditionId); userShop.setMeetRankCondIds(meetRankCondIds); savePreHitLog(userShop, precondition, log -> { - log.setReachValue(new BigDecimal(stringTypedTuple.getScore().toString())); + log.setReachValue(rankLog.getReachValue()); log.setCondValue(new BigDecimal(endIndex + 1)); log.setRank(rank.incrementAndGet()); }); } - }); + } } } @@ -435,6 +435,100 @@ public abstract class EvalRewardBaseCalculator implements Calculator calculateRankParamValue(List userShops, Long evalGroupRewardId, List params) { + List rankLogs = Lists.newArrayListWithCapacity(userShops.size()); + for (EvalGroupUserShop userShop : userShops) { + BigDecimal commissionValue = BigDecimal.ZERO; + for (EvalGroupRewardParam param: params) { + String indicatorCode = param.getCode(); + boolean isCap = Boolean.TRUE.equals(param.getCap()); + BigDecimal proportion = param.getProportion(); + TargetTypeEnum targetType = param.getTargetType(); + final BigDecimal userOriginValue = queryValue(userShop, param.getCodeType(), indicatorCode).orElse(BigDecimal.ZERO); + BigDecimal _calcValue = userOriginValue; + if (!TargetTypeEnum.NO.equals(targetType)) { + _calcValue = calculateTargetValue(param.getTargetCalcType(), param.getTargetValue(), _calcValue); + saveTargetHitLog(userShop, param.getId(), IndicatorTypeEnum.EXAMINE, userOriginValue, _calcValue); + } + if (isCap) { + _calcValue = _calcValue.compareTo(BigDecimal.ONE) > 0 ? BigDecimal.ONE : _calcValue; + } + commissionValue = commissionValue.add(proportion.multiply(_calcValue)); + } + EvalGroupRewardRankLog rankLog = EvalGroupRewardRankLog.builder() + .poolId(userShop.getPoolId()) + .scopeType(userShop.getScopeType()) + .referId(evalGroupRewardId) + .targetType(RankIndicatorTypeEnum.REWARD_COMMISSION) + .value(commissionValue) + .reachValue(commissionValue) + .dataDate(userShop.getDataDate()) + .groupId(userShop.getGroupId()) + .build(); + rankLogs.add(rankLog); + } + return rankLogs; + } + + /** + * 计算排名条件最终值 + * + * @param userShops + * @param precondition + * @return + */ + protected List calculateRankPreconditionValue(List userShops, EvalGroupRewardPrecondition precondition) { + final String indicatorCode = precondition.getCode(); + final Long preconditionId = precondition.getId(); + final TargetTypeEnum targetType = precondition.getTargetType(); + final BigDecimal targetValue = precondition.getTargetValue(); + final TargetCalcTypeEnum targetCalcType = precondition.getTargetCalcType(); + + List rankLogs = Lists.newArrayListWithCapacity(userShops.size()); + for (EvalGroupUserShop userShop : userShops) { + final BigDecimal indicatorValue = queryValue(userShop, precondition.getCodeType(), indicatorCode).orElse(BigDecimal.ZERO); + BigDecimal reachValue = indicatorValue; + if (!TargetTypeEnum.NO.equals(targetType)) { + reachValue = calculateTargetValue(targetCalcType, targetValue, indicatorValue); + } + + EvalGroupRewardRankLog rankLog = EvalGroupRewardRankLog.builder() + .poolId(userShop.getPoolId()) + .scopeType(userShop.getScopeType()) + .referId(preconditionId) + .targetType(RankIndicatorTypeEnum.PRE) + .value(indicatorValue) + .reachValue(reachValue) + .dataDate(userShop.getDataDate()) + .groupId(userShop.getGroupId()) + .build(); + rankLogs.add(rankLog); + } + return rankLogs; + } + + public void saveRankLogs(Long evalGroupRewardId, List rankLogs, RankIndicatorTypeEnum targetType) { + Set poolIds = rankLogs.stream().map(EvalGroupRewardRankLog::getPoolId).collect(Collectors.toSet()); + EvalGroupRewardRankLog rankLog = rankLogs.stream().findFirst().get(); + evalGroupRewardRankLogService.remove(Wrappers.lambdaQuery() + .in(EvalGroupRewardRankLog::getPoolId, poolIds) + .eq(EvalGroupRewardRankLog::getScopeType, rankLog.getScopeType()) + .eq(EvalGroupRewardRankLog::getReferId, evalGroupRewardId) + .eq(EvalGroupRewardRankLog::getTargetType, targetType) + .eq(EvalGroupRewardRankLog::getGroupId, rankLog.getGroupId()) + ); + + evalGroupRewardRankLogService.saveBatch(rankLogs); + } + + /** * 初始化奖惩值 * * @param userShops 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 ac89a52..611f5aa 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 @@ -1,33 +1,26 @@ package cn.fw.morax.service.biz.calculator.eval.reward; -import cn.fw.morax.common.utils.DateUtil; import cn.fw.morax.common.utils.PublicUtil; import cn.fw.morax.domain.bo.eval.EvalGroupUserShop; -import cn.fw.morax.domain.db.eval.EvalGroupReward; -import cn.fw.morax.domain.db.eval.EvalGroupRewardLadders; -import cn.fw.morax.domain.db.eval.EvalGroupRewardParam; -import cn.fw.morax.domain.db.eval.EvalGroupRewardPrecondition; +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.service.biz.CommonService; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; -import org.springframework.data.redis.core.BoundZSetOperations; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.math.RoundingMode; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @author jiangchao @@ -40,6 +33,7 @@ import java.util.Set; public class EvalRewardRankCalculator extends EvalRewardBaseCalculator { private final StringRedisTemplate stringRedisTemplate; + private final CommonService commonService; @Value("${spring.cache.custom.global-prefix}:eval:reward:rank") @Getter @@ -70,48 +64,45 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator { return; } - BoundZSetOperations zSetOps = stringRedisTemplate.boundZSetOps(key); - stringRedisTemplate.expireAt(key, DateUtil.localDateTime2Date(LocalDateTime.now().plus(2L, ChronoUnit.HOURS))); - - Map rewardObjectBOMap = new HashMap<>(); - Map referCommonMap = new HashMap<>(); - for (EvalGroupUserShop rewardObject : userShops) { - BigDecimal commissionValue = calculateParamValue(rewardObject, params); - zSetOps.add(rewardObject.getReferId().toString(), commissionValue.doubleValue()); - - referCommonMap.put(rewardObject.getReferId().toString(), commissionValue); - rewardObjectBOMap.put(rewardObject.getReferId().toString(), rewardObject); - } + //计算排名 + List rankLogs = calculateRankParamValue(userShops, evalGroupRewardId, params); + Collections.sort(rankLogs); + commonService.calcRank(rankLogs); + saveRankLogs(evalGroupRewardId, rankLogs, RankIndicatorTypeEnum.REWARD_COMMISSION); + Map poolUserShopMap = userShops.stream().collect(Collectors.toMap(EvalGroupUserShop::getPoolId, + Function.identity(), (v1, v2) -> v1)); + //计算金额 final BigDecimal personCount = BigDecimal.valueOf(userShops.size()); List ladders = queryRewardLadders(evalGroupRewardId); for (EvalGroupRewardLadders ladder : ladders) { final BigDecimal money = ladder.getMoney(); - Integer startIndex = null; - Integer endIndex = null; + 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() - 1; - } else { - startIndex = ladder.getLower().intValue() - 1; - endIndex = ladder.getUpper().intValue()- 1; + endIndex = ladder.getUpper().multiply(personCount).divide(BigDecimal.ONE, 0, RoundingMode.FLOOR).intValue(); } if (startIndex > endIndex) { continue; } - Set referIdStrs = zSetOps.reverseRange(startIndex, endIndex); - for (String referIdStr : referIdStrs) { - EvalGroupUserShop userShop = rewardObjectBOMap.get(referIdStr); + Integer _startIndex = startIndex, _endIndex = endIndex;; + List matchRankLogs = rankLogs.stream().filter(rankLog -> { + return rankLog.getRank() > _startIndex && rankLog.getRank() <= _endIndex; + }).collect(Collectors.toList()); + + for (EvalGroupRewardRankLog rankLog : matchRankLogs) { + EvalGroupUserShop userShop = poolUserShopMap.get(rankLog.getPoolId()); boolean examined = examinePrecondition(userShop, preconditions); if (!examined) { userShop.setEvalGroupRewardAmount(BigDecimal.ZERO); continue; } userShop.setEvalGroupRewardAmount(money); - BigDecimal hitCommissionValue = referCommonMap.get(referIdStr); + BigDecimal hitCommissionValue = rankLog.getReachValue(); clearProjectHitLog(evalGroupRewardId, userShop); saveProjectHitLog(evalGroupRewardId, userShop, log -> { log.setRewardValue(money); diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/kpi/KpiAbsBaseCalculator.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/kpi/KpiAbsBaseCalculator.java index 07c36b2..ce3b286 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/kpi/KpiAbsBaseCalculator.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/kpi/KpiAbsBaseCalculator.java @@ -8,19 +8,19 @@ import cn.fw.morax.domain.enums.TargetCalcTypeEnum; import cn.fw.morax.domain.enums.TargetTypeEnum; import cn.fw.morax.service.biz.calculator.Calculator; import cn.fw.morax.service.data.kpi.*; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.google.common.base.Strings; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.function.Consumer; /** @@ -47,6 +47,20 @@ public abstract class KpiAbsBaseCalculator implements Calculator set = new HashSet<>(); + set.add(1L); + set.add(2L); + set.add(3L); + String json = JSON.toJSONString(set); + System.out.println(json); + List set2 = JSON.parseArray(json, Long.class); + System.out.println(set2.toString()); + System.out.println(Arrays.toString(set2.toArray())); + String join = StringUtils.join(",", set); + System.out.println(join); + } + /** * 获取设置类型 * diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupPoolService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupPoolService.java index 8ebf674..00885be 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupPoolService.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupPoolService.java @@ -60,6 +60,7 @@ public class EvalGroupPoolService { private final EvalGroupRewardLaddersService evalGroupRewardLaddersService; private final EvalPoolRewardDetailService evalPoolRewardDetailService; private final EvalGroupRewardParamService evalGroupRewardParamService; + private final EvalGroupRewardRankLogService evalGroupRewardRankLogService; private final EvalGroupRewardHitLogService evalGroupRewardHitLogService; private final IndicatorUserValueService indicatorUserValueService; private final EvalIndicatorValueService evalIndicatorValueService; @@ -1226,4 +1227,39 @@ public class EvalGroupPoolService { } } + public List getRewardCondRankLogs(Long preconditionId, LocalDate dataDate) { + EvalGroupRewardPrecondition precondition = evalGroupRewardPreconditionService.getById(preconditionId); + BV.notNull(precondition, "奖惩条件不存在"); + final DataTypeEnum dataType = precondition.getDataType(); + final TargetTypeEnum targetType = precondition.getTargetType(); + List rankLogs = evalGroupRewardRankLogService.list(Wrappers.lambdaQuery() + .eq(EvalGroupRewardRankLog::getDataDate, dataDate) + .eq(EvalGroupRewardRankLog::getReferId, preconditionId) + .eq(EvalGroupRewardRankLog::getTargetType, RankIndicatorTypeEnum.PRE) + .eq(EvalGroupRewardRankLog::getYn, Boolean.TRUE) + ); + Collections.sort(rankLogs); + + List rankLogVOs = PublicUtil.copyList(rankLogs, EvalGroupRewardRankLogVO.class); + rankLogVOs.stream().forEach(rankLog -> rankLog.convertValueToPercent(dataType, targetType)); + return rankLogVOs; + } + + public List queryRewardCommissionRank(Long commissionId, LocalDate dataDate) { +// EvalGroupRewardPrecondition precondition = evalGroupRewardPreconditionService.getById(preconditionId); +// BV.notNull(precondition, "奖惩条件不存在"); +// final DataTypeEnum dataType = precondition.getDataType(); +// final TargetTypeEnum targetType = precondition.getTargetType(); + List rankLogs = evalGroupRewardRankLogService.list(Wrappers.lambdaQuery() + .eq(EvalGroupRewardRankLog::getDataDate, dataDate) + .eq(EvalGroupRewardRankLog::getReferId, commissionId) + .eq(EvalGroupRewardRankLog::getTargetType, RankIndicatorTypeEnum.REWARD_COMMISSION) + .eq(EvalGroupRewardRankLog::getYn, Boolean.TRUE) + ); + Collections.sort(rankLogs); + + List rankLogVOs = PublicUtil.copyList(rankLogs, EvalGroupRewardRankLogVO.class); +// rankLogVOs.stream().forEach(rankLog -> rankLog.convertValueToPercent(dataType, targetType)); + return rankLogVOs; + } } diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupRewardRankLogService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupRewardRankLogService.java new file mode 100644 index 0000000..8382929 --- /dev/null +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupRewardRankLogService.java @@ -0,0 +1,26 @@ +package cn.fw.morax.service.data.eval; + + +import cn.fw.morax.domain.db.eval.EvalGroupRewardRankLog; +import cn.fw.morax.domain.db.eval.EvalGroupRewardTargetHitLog; +import cn.fw.morax.domain.enums.EvalScopeEnum; +import cn.fw.morax.domain.enums.IndicatorTypeEnum; +import cn.fw.morax.domain.vo.eval.EvalGroupRewardTargetHitLogVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.time.YearMonth; +import java.util.List; +import java.util.Set; + +/** + *

+ * 考评奖惩 服务类 + *

+ * + * @author jiangchao + * @since 2022-12-09 + */ +public interface EvalGroupRewardRankLogService extends IService { + + +} diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupRewardRankLogServiceImpl.java b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupRewardRankLogServiceImpl.java new file mode 100644 index 0000000..59d8e82 --- /dev/null +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupRewardRankLogServiceImpl.java @@ -0,0 +1,33 @@ +package cn.fw.morax.service.data.eval.impl; + + +import cn.fw.morax.dao.eval.EvalGroupRewardRankLogDao; +import cn.fw.morax.dao.eval.EvalGroupRewardTargetHitLogDao; +import cn.fw.morax.domain.db.eval.EvalGroupRewardRankLog; +import cn.fw.morax.domain.db.eval.EvalGroupRewardTargetHitLog; +import cn.fw.morax.domain.enums.EvalScopeEnum; +import cn.fw.morax.domain.enums.IndicatorTypeEnum; +import cn.fw.morax.domain.vo.eval.EvalGroupRewardTargetHitLogVO; +import cn.fw.morax.service.data.eval.EvalGroupRewardRankLogService; +import cn.fw.morax.service.data.eval.EvalGroupRewardTargetHitLogService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import java.time.YearMonth; +import java.util.List; +import java.util.Set; + +/** + *

+ * 考评指标达成目标记录 服务实现类 + *

+ * + * @author jiangchao + * @since 2022-12-09 + */ +@Service +public class EvalGroupRewardRankLogServiceImpl + extends ServiceImpl + implements EvalGroupRewardRankLogService { + +}