Commit 016eb879d47a16377795cf8cea70b3a1b56b6a24
1 parent
47dc3c71
feature(*): 考评人员维度数据处理
考评人员维度数据处理
Showing
9 changed files
with
121 additions
and
43 deletions
doc/2023-05-18_update.sql
1 | +-- 2024年4月3日 | |
2 | +ALTER TABLE `fw_morax`.`eval_group_user` | |
3 | + ADD COLUMN `staff_status` tinyint(8) NULL COMMENT '当前员工状态:1->试用,2->正式,8->待离职,9->离职' AFTER `data_date`; | |
4 | + | |
5 | +ALTER TABLE `fw_morax`.`eval_user_report` | |
6 | + ADD COLUMN `staff_type` tinyint(4) NULL COMMENT '员工分类: 0->绩效员工: 非0->其他员工(KpiIgnoreCauseEnum枚举取值)' AFTER `user_name`; | |
7 | + | |
8 | + | |
1 | 9 | -- 2024年3月20日 |
2 | 10 | ALTER TABLE `fw_morax`.`eval_group_indicator_hit_log` |
3 | 11 | DROP INDEX `eval_reward_hit_log_index`, | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalGroupUser.java
... | ... | @@ -2,6 +2,7 @@ package cn.fw.morax.domain.db.eval; |
2 | 2 | |
3 | 3 | import cn.fw.common.data.entity.BaseAuditableTimeEntity; |
4 | 4 | import cn.fw.morax.domain.enums.KpiIgnoreCauseEnum; |
5 | +import cn.fw.morax.domain.enums.SalaryStaffStatusEnum; | |
5 | 6 | import com.baomidou.mybatisplus.annotation.TableName; |
6 | 7 | import lombok.*; |
7 | 8 | |
... | ... | @@ -87,6 +88,11 @@ public class EvalGroupUser extends BaseAuditableTimeEntity<EvalGroupUser, Long> |
87 | 88 | * 数据日期 |
88 | 89 | */ |
89 | 90 | private LocalDate dataDate; |
91 | + | |
92 | + /** | |
93 | + * '当前员工状态' 当前员工状态:1->试用,2->正式,8->待离职,9->离职 | |
94 | + */ | |
95 | + private SalaryStaffStatusEnum staffStatus; | |
90 | 96 | /** |
91 | 97 | * 集团id |
92 | 98 | */ | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserReport.java
... | ... | @@ -54,6 +54,12 @@ public class EvalUserReport extends BaseEntity<EvalUserReport, Long> { |
54 | 54 | */ |
55 | 55 | private String userName; |
56 | 56 | |
57 | + | |
58 | + /** | |
59 | + * 绩效员工取值0,其他非绩效员工取值 KpiIgnoreCauseEnum 枚举的值value | |
60 | + */ | |
61 | + private Integer staffType; | |
62 | + | |
57 | 63 | /** |
58 | 64 | * 岗位id |
59 | 65 | */ | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/task/EvalUserReportTask.java
... | ... | @@ -45,6 +45,7 @@ import java.math.BigDecimal; |
45 | 45 | import java.math.RoundingMode; |
46 | 46 | import java.time.LocalDate; |
47 | 47 | import java.time.YearMonth; |
48 | +import java.time.temporal.TemporalAdjusters; | |
48 | 49 | import java.util.*; |
49 | 50 | import java.util.concurrent.RejectedExecutionException; |
50 | 51 | import java.util.concurrent.atomic.AtomicInteger; |
... | ... | @@ -197,9 +198,9 @@ public class EvalUserReportTask { |
197 | 198 | } |
198 | 199 | List<EvalUserPool> userPools = evalUserPoolService.getPools(evalGroupRankStageId, YearMonth.from(dataDate)); |
199 | 200 | // .filter(pool -> ! evalGroupUserService.probationStaff(pool.getUserId(), rankStage.getBeginTime(), rankStage.getOverTime())) |
200 | - List<EvalUserPool> nonProbationStaffs = userPools.stream() | |
201 | - .filter(pool -> Boolean.TRUE.equals(pool.getInclusion())) | |
202 | - .collect(Collectors.toList()); | |
201 | +// List<EvalUserPool> nonProbationStaffs = userPools.stream() | |
202 | +// .filter(pool -> Boolean.TRUE.equals(pool.getInclusion())) | |
203 | +// .collect(Collectors.toList()); | |
203 | 204 | List<Long> disableShopIds = invalidShopLogService.queryInvalidShopIds(groupId, dataDate); |
204 | 205 | List<EvalShopPool> shopPools = evalShopPoolService.list(Wrappers.<EvalShopPool>lambdaQuery() |
205 | 206 | .in(EvalShopPool::getEvalGroupId, evalGroupIds) |
... | ... | @@ -223,10 +224,10 @@ public class EvalUserReportTask { |
223 | 224 | EvalGroupReportParamsBO paramsBO = new EvalGroupReportParamsBO(stageDim, rankStage, rank.getGroupId(), multiStage, dataDate); |
224 | 225 | //排名组指标编码、人员、门店 |
225 | 226 | List<EvalUserRankCodeReport> rankCodes = this.saveRankCodeReports(evalGroupIndicators, evalUserRankReportId, evalUserRankStageReportId, paramsBO); |
226 | - List<EvalUserReport> evalUserReports = this.saveStaffReports(nonProbationStaffs, evalUserRankReportId, evalUserRankStageReportId,paramsBO); | |
227 | - List<EvalUserReport> evalShopReports = this.saveShopReports(shopPools, evalUserRankReportId, evalUserRankStageReportId,paramsBO); | |
227 | + List<EvalUserReport> evalUserReports = this.saveStaffReports(userPools, evalUserRankReportId, evalUserRankStageReportId, paramsBO); | |
228 | + List<EvalUserReport> evalShopReports = this.saveShopReports(shopPools, evalUserRankReportId, evalUserRankStageReportId, paramsBO); | |
228 | 229 | //人员维度 |
229 | - calcUser(nonProbationStaffs, evalGroupIndicators, evalGroupIndicatorParamMap, evalUserReports, paramsBO); | |
230 | + calcUser(userPools, evalGroupIndicators, evalGroupIndicatorParamMap, evalUserReports, paramsBO); | |
230 | 231 | //门店维度 |
231 | 232 | calcShop(shopPools, evalGroupIndicators, evalGroupIndicatorParamMap, evalShopReports, paramsBO); |
232 | 233 | //门店维度 |
... | ... | @@ -608,27 +609,43 @@ public class EvalUserReportTask { |
608 | 609 | if (PublicUtil.isEmpty(pools)) { |
609 | 610 | return new ArrayList<>(); |
610 | 611 | } |
612 | + final Long evalGroupRankStageId = paramsBO.getStage().getId(); | |
611 | 613 | final LocalDate dataDate = paramsBO.getDataDate(); |
614 | + final LocalDate stageStartDate = paramsBO.getStage().getBeginTime(); | |
612 | 615 | List<EvalUserReport> evalUserReports = new ArrayList<>(); |
613 | 616 | for (EvalUserPool userPool : pools) { |
614 | - EvalUserReport report = new EvalUserReport(); | |
615 | - report.setStageDim(paramsBO.getStageDimEnum()); | |
616 | - report.setEvalUserRankReportId(evalUserRankReportId); | |
617 | - report.setEvalUserRankStageReportId(evalUserRankStageReportId); | |
618 | - report.setDimension(ReportDimensionEnum.STAFF); | |
619 | - report.setReward(userPool.getReward()); | |
620 | - report.setScore(userPool.getScore()); | |
621 | - report.setScoreRatio(userPool.getScoreRatio().multiply(Constant.ONE_HUNDRED)); | |
622 | - report.setUserId(userPool.getUserId()); | |
623 | - report.setUserName(userPool.getUserName()); | |
624 | - report.setPostId(userPool.getPostId()); | |
625 | - report.setPostName(userPool.getPostName()); | |
626 | - report.setShopId(userPool.getShopId()); | |
627 | - report.setShopName(userPool.getShopName()); | |
628 | - report.setEvalUserPoolId(userPool.getId()); | |
629 | - report.setDataDate(dataDate); | |
630 | - report.setInclusion(userPool.getInclusion()); | |
631 | - evalUserReports.add(report); | |
617 | + EvalUserReport userReport = new EvalUserReport(); | |
618 | + userReport.setStageDim(paramsBO.getStageDimEnum()); | |
619 | + userReport.setEvalUserRankReportId(evalUserRankReportId); | |
620 | + userReport.setEvalUserRankStageReportId(evalUserRankStageReportId); | |
621 | + userReport.setDimension(ReportDimensionEnum.STAFF); | |
622 | + userReport.setReward(userPool.getReward()); | |
623 | + userReport.setScore(userPool.getScore()); | |
624 | + userReport.setScoreRatio(userPool.getScoreRatio().multiply(Constant.ONE_HUNDRED)); | |
625 | + userReport.setUserId(userPool.getUserId()); | |
626 | + userReport.setUserName(userPool.getUserName()); | |
627 | + userReport.setPostId(userPool.getPostId()); | |
628 | + userReport.setPostName(userPool.getPostName()); | |
629 | + userReport.setShopId(userPool.getShopId()); | |
630 | + userReport.setShopName(userPool.getShopName()); | |
631 | + userReport.setEvalUserPoolId(userPool.getId()); | |
632 | + userReport.setDataDate(dataDate); | |
633 | + userReport.setInclusion(userPool.getInclusion()); | |
634 | + | |
635 | + EvalGroupUser evalGroupUser = evalGroupUserService.getMonthStageLastData(evalGroupRankStageId, userPool.getUserId(), | |
636 | + stageStartDate, dataDate); | |
637 | + //处理员工分类 | |
638 | + if (Objects.nonNull(evalGroupUser)){ | |
639 | + if (Objects.nonNull(evalGroupUser.getIgnored()) && (Boolean.FALSE.equals(evalGroupUser.getIgnored()))){ | |
640 | + //绩效员工取值0,其他非绩效员工取值 KpiIgnoreCauseEnum 枚举的值 | |
641 | + userReport.setStaffType(0); | |
642 | + }else { | |
643 | + if (Objects.nonNull(evalGroupUser.getIgnoreCause())){ | |
644 | + userReport.setStaffType(evalGroupUser.getIgnoreCause().getValue()); | |
645 | + } | |
646 | + } | |
647 | + } | |
648 | + evalUserReports.add(userReport); | |
632 | 649 | } |
633 | 650 | evalUserReportService.insertBatchSomeColumn(evalUserReports); |
634 | 651 | return evalUserReports; | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateService.java
... | ... | @@ -722,27 +722,38 @@ public class EvalCalculateService { |
722 | 722 | |
723 | 723 | List<EvalGroupUserShop> userShops = new ArrayList<>(); |
724 | 724 | if (EvalScopeEnum.STAFF.equals(scopeType)) { |
725 | - //考评不计算保护期员工 | |
725 | +// //考评不计算保护期员工 | |
726 | +// List<EvalGroupUser> users = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery() | |
727 | +// .eq(EvalGroupUser::getEvalGroupId, evalGroup.getId()) | |
728 | +// .eq(EvalGroupUser::getDataDate, calcDateParam.getCalcEndDate()) | |
729 | +// .eq(EvalGroupUser::getYn, Boolean.TRUE) | |
730 | +// .eq(EvalGroupUser::getIgnored, Boolean.FALSE) | |
731 | +// ); | |
732 | +// //转正员工要计算 | |
733 | +// List<EvalGroupUser> turnPositiveUsers = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery() | |
734 | +// .eq(EvalGroupUser::getEvalGroupId, evalGroup.getId()) | |
735 | +// .eq(EvalGroupUser::getDataDate, calcDateParam.getCalcEndDate()) | |
736 | +// .eq(EvalGroupUser::getYn, Boolean.TRUE) | |
737 | +// .eq(EvalGroupUser::getIgnored, Boolean.TRUE) | |
738 | +// .eq(EvalGroupUser::getIgnoreCause, KpiIgnoreCauseEnum.TURN_POSITIVE_AFTER) | |
739 | +// ); | |
740 | +// if (PublicUtil.isNotEmpty(turnPositiveUsers)) { | |
741 | +// users.addAll(turnPositiveUsers); | |
742 | +// } | |
726 | 743 | List<EvalGroupUser> users = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery() |
727 | 744 | .eq(EvalGroupUser::getEvalGroupId, evalGroup.getId()) |
728 | 745 | .eq(EvalGroupUser::getDataDate, calcDateParam.getCalcEndDate()) |
729 | 746 | .eq(EvalGroupUser::getYn, Boolean.TRUE) |
730 | - .eq(EvalGroupUser::getIgnored, Boolean.FALSE) | |
731 | - ); | |
732 | - //转正员工要计算 | |
733 | - List<EvalGroupUser> turnPositiveUsers = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery() | |
734 | - .eq(EvalGroupUser::getEvalGroupId, evalGroup.getId()) | |
735 | - .eq(EvalGroupUser::getDataDate, calcDateParam.getCalcEndDate()) | |
736 | - .eq(EvalGroupUser::getYn, Boolean.TRUE) | |
737 | - .eq(EvalGroupUser::getIgnored, Boolean.TRUE) | |
738 | - .eq(EvalGroupUser::getIgnoreCause, KpiIgnoreCauseEnum.TURN_POSITIVE_AFTER) | |
739 | 747 | ); |
740 | - if (PublicUtil.isNotEmpty(turnPositiveUsers)) { | |
741 | - users.addAll(turnPositiveUsers); | |
742 | - } | |
743 | 748 | Map<Long, EvalUserPool> userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroupRankStage, users, calcDateParam.getCalcEndDate(), scopeType); |
744 | 749 | for (EvalGroupUser user : users) { |
745 | 750 | EvalUserPool userPool = userPoolMap.get(user.getUserId()); |
751 | + userPool.setDataDate(user.getDataDate()); | |
752 | + //试用期员工不计算绩效 | |
753 | + if (Boolean.TRUE.equals(user.getIgnored()) && PublicUtil.isNotEmpty(user.getStaffStatus()) && SalaryStaffStatusEnum.PROBATION.equals(user.getStaffStatus())) { | |
754 | + evalUserPoolService.updateById(userPool); | |
755 | + continue; | |
756 | + } | |
746 | 757 | userShops.add(convertBO(user, userPool, evalGroupRank, evalGroupRankStage,calcDateParam, scopeType)); |
747 | 758 | } |
748 | 759 | return userShops; | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateTaskService.java
... | ... | @@ -42,6 +42,7 @@ import org.springframework.transaction.TransactionDefinition; |
42 | 42 | import org.springframework.transaction.TransactionStatus; |
43 | 43 | import org.springframework.transaction.annotation.Transactional; |
44 | 44 | |
45 | +import java.math.BigDecimal; | |
45 | 46 | import java.time.LocalDate; |
46 | 47 | import java.time.LocalDateTime; |
47 | 48 | import java.time.YearMonth; |
... | ... | @@ -313,12 +314,7 @@ public class EvalCalculateTaskService { |
313 | 314 | for (Long postId : rewardDim.getPostIds()) { |
314 | 315 | List<EvalGroupUser> manageEvalGroupUsers = evalGroupUserBizService.fetchPostUsers(groupId, postId, rewardDim.getShopIds(), dataDate); |
315 | 316 | if (PublicUtil.isNotEmpty(manageEvalGroupUsers)) { |
316 | - for (EvalGroupUser user : manageEvalGroupUsers) { | |
317 | - user.setEvalGroupRankId(evalGroupRankId); | |
318 | - user.setEvalGroupRankStageId(evalGroupRankStageId); | |
319 | - user.setEvalGroupId(-1L); | |
320 | - user.setEgc(""); | |
321 | - } | |
317 | + this.addManageEvalUser(manageEvalGroupUsers, evalGroupRankId, evalGroupRankStageId); | |
322 | 318 | managerEvalGroupUsersForSave.addAll(manageEvalGroupUsers); |
323 | 319 | } |
324 | 320 | } |
... | ... | @@ -357,12 +353,28 @@ public class EvalCalculateTaskService { |
357 | 353 | |
358 | 354 | } |
359 | 355 | |
356 | + public void addManageEvalUser(List<EvalGroupUser> manageEvalGroupUsers, Long evalGroupRankId, Long evalGroupRankStageId) { | |
357 | + if (PublicUtil.isEmpty(manageEvalGroupUsers)) { | |
358 | + return; | |
359 | + } | |
360 | + for (EvalGroupUser user : manageEvalGroupUsers) { | |
361 | + user.setEvalGroupRankId(evalGroupRankId); | |
362 | + user.setEvalGroupRankStageId(evalGroupRankStageId); | |
363 | + user.setEvalGroupId(-1L); | |
364 | + user.setEgc(""); | |
365 | + } | |
366 | + } | |
367 | + | |
360 | 368 | public void updatePoolOtherInfo(List<EvalGroupUser> users, EvalScopeEnum scopeType) { |
361 | 369 | for (EvalGroupUser user : users) { |
362 | 370 | EvalUserPool userPool = evalPoolCommonService.inspectionUserPool(user, scopeType); |
363 | 371 | //忽略就不计算 |
364 | 372 | Boolean inclusion = Boolean.TRUE.equals(user.getIgnored()) ? Boolean.FALSE : Boolean.TRUE; |
365 | 373 | userPool.setInclusion(inclusion); |
374 | + //不纳入计算,奖惩清空 | |
375 | + if (Boolean.FALSE.equals(inclusion)) { | |
376 | + userPool.setReward(BigDecimal.ZERO); | |
377 | + } | |
366 | 378 | evalUserPoolService.updateById(userPool); |
367 | 379 | } |
368 | 380 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalGroupUserBizService.java
... | ... | @@ -7,6 +7,7 @@ import cn.fw.morax.domain.db.eval.EvalUserPool; |
7 | 7 | import cn.fw.morax.domain.dto.IgnoreCauseDTO; |
8 | 8 | import cn.fw.morax.domain.dto.IgnoreCauseReqDTO; |
9 | 9 | import cn.fw.morax.domain.dto.query.ShopsPostsQueryDTO; |
10 | +import cn.fw.morax.domain.enums.SalaryStaffStatusEnum; | |
10 | 11 | import cn.fw.morax.domain.vo.eval.EvalGroupUserVO; |
11 | 12 | import cn.fw.morax.rpc.ehr.EhrRpcService; |
12 | 13 | import cn.fw.morax.rpc.ehr.dto.PerformanceStaffDTO; |
... | ... | @@ -191,6 +192,7 @@ public class EvalGroupUserBizService { |
191 | 192 | */ |
192 | 193 | public void handleStaffKpi(PerformanceStaffDTO staff, EvalGroupUser evalUser, IgnoreCauseReqDTO rejectCauseReq) { |
193 | 194 | try { |
195 | + evalUser.setStaffStatus(SalaryStaffStatusEnum.ofValue(staff.getStaffStatus())); | |
194 | 196 | //获取忽略绩效理由 |
195 | 197 | IgnoreCauseDTO ignoreCauseDTO = commonService.findIgnoreCauseDTO(staff, rejectCauseReq); |
196 | 198 | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/EvalGroupUserService.java
... | ... | @@ -20,6 +20,8 @@ public interface EvalGroupUserService extends ILocalService<EvalGroupUser> { |
20 | 20 | |
21 | 21 | EvalGroupUser getMonthLastData(Long evalGroupId, Long userId, YearMonth yearMonth); |
22 | 22 | |
23 | + EvalGroupUser getMonthStageLastData(Long evalGroupStageId, Long userId, LocalDate startDate, LocalDate endDate); | |
24 | + | |
23 | 25 | /** |
24 | 26 | * 试用期员工 |
25 | 27 | * | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalGroupServiceUserImpl.java
... | ... | @@ -33,6 +33,20 @@ public class EvalGroupServiceUserImpl extends ServiceImpl<EvalGroupUserDao, Eval |
33 | 33 | } |
34 | 34 | |
35 | 35 | @Override |
36 | + public EvalGroupUser getMonthStageLastData(Long evalGroupStageId, Long userId, LocalDate startDate, LocalDate endDate) { | |
37 | + return this.getOne(Wrappers.<EvalGroupUser>lambdaQuery() | |
38 | + .eq(EvalGroupUser::getEvalGroupRankStageId, evalGroupStageId) | |
39 | + .eq(EvalGroupUser::getUserId, userId) | |
40 | + .ge(EvalGroupUser::getDataDate, startDate) | |
41 | + .le(EvalGroupUser::getDataDate, endDate) | |
42 | + .eq(EvalGroupUser::getYn, Boolean.TRUE) | |
43 | + .orderByDesc(EvalGroupUser::getDataDate) | |
44 | + .last(" limit 1 ") | |
45 | + , Boolean.FALSE | |
46 | + ); | |
47 | + } | |
48 | + | |
49 | + @Override | |
36 | 50 | public Boolean probationStaff(Long userId, LocalDate beginTime, LocalDate endTime) { |
37 | 51 | List<EvalGroupUser> users = this.list(Wrappers.<EvalGroupUser>lambdaQuery() |
38 | 52 | .ge(EvalGroupUser::getDataDate, beginTime) | ... | ... |