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 {
+
+}