From 2a32e29afdfd37bb8a8d00a0bfb9c5202aa00273 Mon Sep 17 00:00:00 2001 From: jiangchao Date: Wed, 22 Mar 2023 17:51:39 +0800 Subject: [PATCH] feature(*): 人员质量评测排名计算 --- doc/2023_update.sql | 4 ++++ fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/kpi/KpiGroupCalculableRankBO.java | 4 ++++ fw-morax-domain/src/main/java/cn/fw/morax/domain/db/kpi/KpiPool.java | 4 ++++ fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiCalcMonthlyTask.java | 4 ++-- fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiCalcTask.java | 2 +- fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiAssessBizService.java | 1 + fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiCalculateAssessService.java | 3 ++- fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiPoolBizService.java | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++----------- 8 files changed, 68 insertions(+), 15 deletions(-) diff --git a/doc/2023_update.sql b/doc/2023_update.sql index 4d85767..fdc00cf 100644 --- a/doc/2023_update.sql +++ b/doc/2023_update.sql @@ -1,3 +1,7 @@ + +-- 2023年3月22日 +ALTER TABLE `fw_morax`.`kpi_pool` + ADD COLUMN `assess_rank` int(11) NULL COMMENT '人员质量评测排名' AFTER `rank`; -- 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`; diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/kpi/KpiGroupCalculableRankBO.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/kpi/KpiGroupCalculableRankBO.java index 72c7b02..a4daf40 100644 --- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/kpi/KpiGroupCalculableRankBO.java +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/kpi/KpiGroupCalculableRankBO.java @@ -22,6 +22,10 @@ import java.util.List; @AllArgsConstructor public class KpiGroupCalculableRankBO { /** + * 最终计算 + */ + private Boolean finalCalc; + /** * 单个绩效组计算 */ private Boolean calculateSeparately; diff --git a/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/kpi/KpiPool.java b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/kpi/KpiPool.java index 75c12a3..0a23e5f 100644 --- a/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/kpi/KpiPool.java +++ b/fw-morax-domain/src/main/java/cn/fw/morax/domain/db/kpi/KpiPool.java @@ -93,6 +93,10 @@ public class KpiPool extends BaseAuditableTimeEntity { */ private Integer rank; /** + * 人员质量评测排名 + */ + private Integer assessRank; + /** * 集团id */ private Long groupId; diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiCalcMonthlyTask.java b/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiCalcMonthlyTask.java index 55b3c26..35be29b 100644 --- a/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiCalcMonthlyTask.java +++ b/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiCalcMonthlyTask.java @@ -41,7 +41,7 @@ public class KpiCalcMonthlyTask { */ @Scheduled(cron = "0 0 1 2 * ?") public void cacheAssessFinalCalcKpiGroupRank() { - kpiPoolBizService.cacheCalculableKpiGroupRank(YearMonth.now().minusMonths(1L).atEndOfMonth()); + kpiPoolBizService.cacheCalculableKpiGroupRank(YearMonth.now().minusMonths(1L).atEndOfMonth(), Boolean.TRUE); } /** @@ -85,7 +85,7 @@ public class KpiCalcMonthlyTask { */ @Scheduled(cron = "0 40 4 2 * ?") public void cacheFinalCalcKpiGroupRank() { - kpiPoolBizService.cacheCalculableKpiGroupRank(YearMonth.now().minusMonths(1L).atEndOfMonth()); + kpiPoolBizService.cacheCalculableKpiGroupRank(YearMonth.now().minusMonths(1L).atEndOfMonth(), Boolean.FALSE); } } diff --git a/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiCalcTask.java b/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiCalcTask.java index 08df1db..1db2032 100644 --- a/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiCalcTask.java +++ b/fw-morax-server/src/main/java/cn/fw/morax/server/task/KpiCalcTask.java @@ -82,7 +82,7 @@ public class KpiCalcTask { */ @Scheduled(cron = TimeTaskConstant.CACHE_CALCULATE_KPI_GROUP_RANK) public void cacheCalculableKpiGroupRank() { - kpiPoolBizService.cacheCalculableKpiGroupRank(LocalDate.now().minusDays(1L)); + kpiPoolBizService.cacheCalculableKpiGroupRank(LocalDate.now().minusDays(1L), Boolean.FALSE); } /** diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiAssessBizService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiAssessBizService.java index e5b8205..7f565c8 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiAssessBizService.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiAssessBizService.java @@ -68,6 +68,7 @@ public class KpiAssessBizService { public AppPage kpiAssessPage(KpiAssessQueryDTO dto) { PageData pageData = kpiAssessService.page(new PageData<>(dto.getCurrent(), dto.getPageSize()), Wrappers.lambdaQuery() + .eq(KpiAssess::getBackup, Boolean.FALSE) .eq(KpiAssess::getGroupId, dto.getGroupId()) .eq(PublicUtil.isNotEmpty(dto.getPostId()), KpiAssess::getPostId, dto.getPostId()) .eq(KpiAssess::getYn, Boolean.TRUE) diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiCalculateAssessService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiCalculateAssessService.java index 8cb31ea..f23d2bf 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiCalculateAssessService.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiCalculateAssessService.java @@ -339,7 +339,8 @@ public class KpiCalculateAssessService { return Boolean.FALSE; } for (KpiPool pool : pools) { - BigDecimal rankDiff = new BigDecimal(rank - pool.getRank()).abs(); + BigDecimal rankDiff = new BigDecimal(rank - pool.getAssessRank()).abs(); + log.info("人员质量评测计算排名差,目标排名:{},绩效池:{},结果:{}", rank, JSON.toJSONString(pool), rankDiff); //奖励 if (rankDiff.compareTo(BigDecimal.ZERO) > 0) { BigDecimal poolAwardScore = rankDiff.multiply(awardScore); diff --git a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiPoolBizService.java b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiPoolBizService.java index 6dc2964..ef705fa 100644 --- a/fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiPoolBizService.java +++ b/fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiPoolBizService.java @@ -13,11 +13,8 @@ import cn.fw.morax.domain.bo.kpi.KpiRankCalculableBO; import cn.fw.morax.domain.bo.kpi.KpiStarLadderBO; import cn.fw.morax.domain.db.kpi.*; import cn.fw.morax.domain.enums.KpiIgnoreCauseEnum; -import cn.fw.morax.domain.enums.ScoreWayEnum; import cn.fw.morax.domain.enums.StarEvaluationEnum; import cn.fw.morax.domain.enums.StarLevelEnum; -import cn.fw.morax.domain.vo.kpi.KpiGroupIndicatorDetailVO; -import cn.fw.morax.domain.vo.kpi.KpiGroupIndicatorLaddersVO; import cn.fw.morax.domain.vo.kpi.KpiPoolDetailVO; import cn.fw.morax.domain.vo.kpi.KpiPoolIndicatorValueVO; import cn.fw.morax.service.data.kpi.*; @@ -229,6 +226,8 @@ public class KpiPoolBizService { } //计算排名 calcRank(poolList); + calcActualRank(bo, poolList, kpiGroupIds); + kpiPoolService.updateBatchById(poolList); } @@ -373,7 +372,7 @@ public class KpiPoolBizService { return; } List pools = poolList.stream() -// .filter(pool -> Boolean.TRUE.equals(pool.getInclusion())) + .filter(pool -> Boolean.TRUE.equals(pool.getInclusion())) .sorted(Comparator.comparing(KpiPool::getAverageKpiScoreRatio, BigDecimal::compareTo).reversed()) .collect(Collectors.toList()); @@ -389,6 +388,43 @@ public class KpiPoolBizService { } /** + * 计算转正保护期、正式员工排名排名 + * + * @param poolList + */ + public void calcActualRank(KpiGroupCalculableRankBO bo, List poolList, List kpiGroupIds) { + if (Boolean.FALSE.equals(bo.getFinalCalc()) || PublicUtil.isEmpty(poolList)) { + return; + } + LocalDate localDate = bo.getLocalDate(); + List turnPositiveUsers = kpiGroupUserService.list(Wrappers.lambdaQuery() + .in(KpiGroupUser::getKpiGroupId, kpiGroupIds) + .eq(KpiGroupUser::getIgnored, Boolean.TRUE) + .eq(KpiGroupUser::getIgnoreCause, KpiIgnoreCauseEnum.TURN_POSITIVE_AFTER) + .eq(KpiGroupUser::getDataDate, localDate) + .eq(KpiGroupUser::getYn, Boolean.TRUE) + ); + Set turnPositiveUserIds = turnPositiveUsers.stream().map(KpiGroupUser::getUserId).collect(Collectors.toSet()); + //转正保护期员工一起排名 + List pools = poolList.stream() + .filter(pool -> { + return Boolean.TRUE.equals(pool.getInclusion()) || (turnPositiveUserIds.contains(pool.getUserId())); + }) + .sorted(Comparator.comparing(KpiPool::getAverageKpiScoreRatio, BigDecimal::compareTo).reversed()) + .collect(Collectors.toList()); + + int rank = 1; + BigDecimal lastKpiScoreRatio = null; + for (KpiPool pool : pools) { + if (PublicUtil.isNotEmpty(lastKpiScoreRatio) && (lastKpiScoreRatio.compareTo(pool.getAverageKpiScoreRatio()) != 0)) { + rank++; + } + pool.setAssessRank(rank); + lastKpiScoreRatio = pool.getAverageKpiScoreRatio(); + } + } + + /** * 生成排序key * * @param key @@ -698,7 +734,7 @@ public class KpiPoolBizService { Boolean.FALSE ); if (Objects.isNull(groupRank)) { - KpiGroupCalculableRankBO rankBO = cacheCalculableKpiGroupRank(kpiGroup, localDate); + KpiGroupCalculableRankBO rankBO = cacheCalculableKpiGroupRank(kpiGroup, localDate, Boolean.FALSE); calcuStarLevel(rankBO); return; } @@ -714,7 +750,7 @@ public class KpiPoolBizService { } } BV.isNotEmpty(kpiGroupIds, () -> MessageFormatTransfer("绩效排名组[{0}]不包含任何绩效组", groupRank.getId())); - KpiGroupCalculableRankBO bo = cacheCalculableKpiGroupRank(groupRank, kpiGroupIds, localDate); + KpiGroupCalculableRankBO bo = cacheCalculableKpiGroupRank(groupRank, kpiGroupIds, localDate, Boolean.FALSE); calcuStarLevel(bo); } @@ -723,7 +759,7 @@ public class KpiPoolBizService { * * @param localDate */ - public void cacheCalculableKpiGroupRank(LocalDate localDate) { + public void cacheCalculableKpiGroupRank(LocalDate localDate, Boolean finalCalc) { List kpiGroups = kpiGroupService.queryKgiGroupsByDay(localDate); if (CollectionUtils.isEmpty(kpiGroups)) { log.info("没有需要计算排名的绩效组,日期:{}", localDate); @@ -743,11 +779,11 @@ public class KpiPoolBizService { } } if (PublicUtil.isNotEmpty(kpiGroupIds)) { - rankBOS.add(JSONObject.toJSONString(cacheCalculableKpiGroupRank(kpiGroupRank, kpiGroupIds, localDate))); + rankBOS.add(JSONObject.toJSONString(cacheCalculableKpiGroupRank(kpiGroupRank, kpiGroupIds, localDate, finalCalc))); } } kpiGroups.stream().filter(kpiGroup -> calculateSeparatelyIds.contains(kpiGroup.getId())).forEach(kpiGroup -> { - rankBOS.add(JSONObject.toJSONString(cacheCalculableKpiGroupRank(kpiGroup, localDate))); + rankBOS.add(JSONObject.toJSONString(cacheCalculableKpiGroupRank(kpiGroup, localDate, finalCalc))); }); ListOperations listOps = stringRedisTemplate.opsForList(); listOps.rightPushAll(getCalcuStarKey(), rankBOS); @@ -790,7 +826,8 @@ public class KpiPoolBizService { return calculableBO; } - private KpiGroupCalculableRankBO cacheCalculableKpiGroupRank(KpiGroupRank kpiGroupRank, Set kpiGroupIds, LocalDate date) { + private KpiGroupCalculableRankBO cacheCalculableKpiGroupRank(KpiGroupRank kpiGroupRank, Set kpiGroupIds, + LocalDate date, Boolean finalCalc) { return KpiGroupCalculableRankBO.builder() .kpiGroupIds(new ArrayList<>(kpiGroupIds)) .groupId(kpiGroupRank.getGroupId()) @@ -798,16 +835,18 @@ public class KpiPoolBizService { .revokedScoreRatio(kpiGroupRank.getRevokedScoreRatio()) .calculateSeparately(Boolean.FALSE) .kpiGroupRankId(kpiGroupRank.getId()) + .finalCalc(finalCalc) .build(); } - private KpiGroupCalculableRankBO cacheCalculableKpiGroupRank(KpiGroup kpiGroup, LocalDate date) { + private KpiGroupCalculableRankBO cacheCalculableKpiGroupRank(KpiGroup kpiGroup, LocalDate date, Boolean finalCalc) { return KpiGroupCalculableRankBO.builder() .kpiGroupIds(Collections.singletonList(kpiGroup.getId())) .groupId(kpiGroup.getGroupId()) .revokedScoreRatio(kpiGroup.getRevokedScoreRatio()) .localDate(date) .calculateSeparately(Boolean.TRUE) + .finalCalc(finalCalc) .build(); } -- libgit2 0.22.2