Commit 53b6dcbc0c4be8d00704d3971d4c2fded38c5343
Merge branch 'main' into test
# Conflicts: # doc/2023-05-18_update.sql
Showing
25 changed files
with
671 additions
and
190 deletions
doc/2023-05-18_update.sql
1 | 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) default 0 COMMENT '员工分类: 0->绩效员工: 非0->其他员工(KpiIgnoreCauseEnum枚举取值)' AFTER `user_name`; | |
7 | + | |
8 | +ALTER TABLE `fw_morax`.`eval_group_user` | |
9 | + ADD COLUMN `leave_date` date NULL COMMENT '离职时间' AFTER `staff_status`; | |
10 | + | |
2 | 11 | |
3 | 12 | -- 2024年3月20日 |
4 | 13 | ALTER TABLE `fw_morax`.`eval_group_indicator_hit_log` | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalExtractStageIndicatorBO.java
... | ... | @@ -22,7 +22,7 @@ import java.util.concurrent.atomic.AtomicInteger; |
22 | 22 | public class EvalExtractStageIndicatorBO { |
23 | 23 | private Long evalCalcId; |
24 | 24 | private Long evalGroupRankId; |
25 | - private Set<Long> evalGroupIds; | |
25 | +// private Set<Long> evalGroupIds; | |
26 | 26 | private LocalDate localDate; |
27 | 27 | private Boolean realTimeCalc; |
28 | 28 | // private AtomicInteger atomicInteger; | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalGroupCalculableBO.java
fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalGroupRankConfigBO.java
0 → 100644
1 | +package cn.fw.morax.domain.bo.eval; | |
2 | + | |
3 | +import cn.fw.morax.domain.db.eval.EvalGroup; | |
4 | +import cn.fw.morax.domain.db.eval.EvalGroupRank; | |
5 | +import cn.fw.morax.domain.db.eval.EvalGroupRankStage; | |
6 | +import lombok.AllArgsConstructor; | |
7 | +import lombok.Data; | |
8 | +import lombok.NoArgsConstructor; | |
9 | + | |
10 | +import java.time.LocalDate; | |
11 | +import java.util.Set; | |
12 | + | |
13 | +/** | |
14 | + * @author : kurisu | |
15 | + * @version : 1.0 | |
16 | + * @className : KpiGroupCalculableBO | |
17 | + * @description : 需要计算绩效的考评组 | |
18 | + * @date : 2022-04-16 11:31 | |
19 | + */ | |
20 | +@Data | |
21 | +@NoArgsConstructor | |
22 | +@AllArgsConstructor | |
23 | +public class EvalGroupRankConfigBO { | |
24 | + | |
25 | + private EvalGroupRank evalGroupRank; | |
26 | + | |
27 | + private EvalGroupRankStage evalGroupRankStage; | |
28 | + | |
29 | + private EvalGroup evalGroup; | |
30 | +} | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/bo/eval/EvalGroupUserShop.java
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,16 @@ public class EvalGroupUser extends BaseAuditableTimeEntity<EvalGroupUser, Long> |
87 | 88 | * 数据日期 |
88 | 89 | */ |
89 | 90 | private LocalDate dataDate; |
91 | + | |
92 | + /** | |
93 | + * 离职日期 | |
94 | + */ | |
95 | + private LocalDate leaveDate; | |
96 | + | |
97 | + /** | |
98 | + * '当前员工状态' 当前员工状态:1->试用,2->正式,8->待离职,9->离职 | |
99 | + */ | |
100 | + private SalaryStaffStatusEnum staffStatus; | |
90 | 101 | /** |
91 | 102 | * 集团id |
92 | 103 | */ | ... | ... |
fw-morax-domain/src/main/java/cn/fw/morax/domain/db/eval/EvalUserPool.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.EvalPoolBusinessTypeEnum; |
5 | +import com.baomidou.mybatisplus.annotation.FieldStrategy; | |
5 | 6 | import com.baomidou.mybatisplus.annotation.TableField; |
6 | 7 | import com.baomidou.mybatisplus.annotation.TableLogic; |
7 | 8 | import com.baomidou.mybatisplus.annotation.TableName; |
... | ... | @@ -111,6 +112,7 @@ public class EvalUserPool extends BaseAuditableTimeEntity<EvalUserPool, Long> { |
111 | 112 | /** |
112 | 113 | * 排名 |
113 | 114 | */ |
115 | + @TableField(updateStrategy = FieldStrategy.IGNORED) | |
114 | 116 | private Integer rank; |
115 | 117 | |
116 | 118 | /** | ... | ... |
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-domain/src/main/java/cn/fw/morax/domain/enums/KpiIgnoreCauseEnum.java
... | ... | @@ -27,6 +27,8 @@ public enum KpiIgnoreCauseEnum implements IEnum<Integer> { |
27 | 27 | TRANSPOST_BEFORE_15(10, "15号以前调岗不计入绩效考核"), |
28 | 28 | LEAVE_DAY_OVERLENGTH_IGNORE_KPI(11, "请假超过X天不计入绩效考核"), |
29 | 29 | TURN_POSITIVE_POSITION(12, "调岗保护期内不计入绩效考核"), |
30 | + EVAL_MULTISTAGE_TIME_POST_CHANGE(13, "考评多阶段时间内调岗,不纳入考评计算"), | |
31 | + EVAL_MULTISTAGE_TIME_LEAVE(14, "考评多阶段时间内离职,不纳入考评计算"), | |
30 | 32 | ; |
31 | 33 | |
32 | 34 | /** | ... | ... |
fw-morax-server/src/main/java/cn/fw/morax/server/controller/erp/EvalTaskController.java
... | ... | @@ -112,7 +112,7 @@ public class EvalTaskController { |
112 | 112 | throw new BusinessException("参数为空"); |
113 | 113 | } |
114 | 114 | LocalDate calcDate = PublicUtil.isEmpty(date) ? evalCalc.getCalcDate() : DateUtil.date2LocalDate(date); |
115 | - evalCalculateTaskService.cacheStageIndicator(evalCalcId, evalCalc.getEvalGroupRankId(), new HashSet<>(evalCalc.getEvalGroupIds()), Boolean.TRUE, calcDate); | |
115 | + evalCalculateTaskService.cacheStageIndicator(evalCalcId, evalCalc.getEvalGroupRankId(), Boolean.TRUE, calcDate); | |
116 | 116 | return success(); |
117 | 117 | } |
118 | 118 | ... | ... |
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,38 @@ 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 | + userReport.setStaffType(0); | |
636 | + | |
637 | + EvalGroupUser evalGroupUser = evalGroupUserService.getMonthStageLastData(evalGroupRankStageId, userPool.getUserId(), | |
638 | + stageStartDate, dataDate); | |
639 | + //处理员工分类 | |
640 | + if (PublicUtil.isNotEmpty(evalGroupUser) && PublicUtil.isNotEmpty(evalGroupUser.getIgnoreCause()) ){ | |
641 | + userReport.setStaffType(evalGroupUser.getIgnoreCause().getValue()); | |
642 | + } | |
643 | + evalUserReports.add(userReport); | |
632 | 644 | } |
633 | 645 | evalUserReportService.insertBatchSomeColumn(evalUserReports); |
634 | 646 | return evalUserReports; | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/CommonService.java
... | ... | @@ -959,7 +959,7 @@ public class CommonService { |
959 | 959 | /** |
960 | 960 | * 获取员工非降级旧岗位调岗日期 |
961 | 961 | */ |
962 | - private LocalDate getNewPostChangeDate(Long userId, Long postId){ | |
962 | + public LocalDate getNewPostChangeDate(Long userId, Long postId){ | |
963 | 963 | String newPostChangeKey = String.join(":", staffNewPostChangeDate, userId+"", postId+""); |
964 | 964 | if (! stringRedisTemplate.hasKey(newPostChangeKey)) { |
965 | 965 | return null; | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardProportionCalculator.java
... | ... | @@ -49,7 +49,7 @@ public class EvalRewardProportionCalculator extends EvalRewardBaseCalculator { |
49 | 49 | |
50 | 50 | @Override |
51 | 51 | public void calculateGroup(List<EvalGroupUserShop> userShops, EvalGroupRewardBO reward) { |
52 | - userShops = userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList()); | |
52 | + userShops = userShops.stream().filter(userShop -> Boolean.TRUE.equals(userShop.getInclusion())).collect(Collectors.toList()); | |
53 | 53 | if (PublicUtil.isEmpty(userShops)) { |
54 | 54 | return; |
55 | 55 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/eval/reward/EvalRewardRankCalculator.java
... | ... | @@ -44,7 +44,7 @@ public class EvalRewardRankCalculator extends EvalRewardBaseCalculator { |
44 | 44 | |
45 | 45 | @Override |
46 | 46 | public void calculateGroup(List<EvalGroupUserShop> userShops, EvalGroupRewardBO reward) { |
47 | - userShops = userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList()); | |
47 | + userShops = userShops.stream().filter(userShop -> Boolean.TRUE.equals(userShop.getInclusion())).collect(Collectors.toList()); | |
48 | 48 | if (PublicUtil.isEmpty(userShops)) { |
49 | 49 | return; |
50 | 50 | } | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/calculator/salary/StarSalaryCalculator.java
... | ... | @@ -62,7 +62,7 @@ public class StarSalaryCalculator extends SalaryBaseCalculator { |
62 | 62 | //只能查询指定日期月份人员岗位纬度的最新星级 |
63 | 63 | Optional<KpiPool> optionalKpiPool = kpiPoolCommonService.queryPool(param2); |
64 | 64 | if (! optionalKpiPool.isPresent()) { |
65 | - log.error("用户[{}]的绩效数据不存在", userId); | |
65 | +// log.error("用户[{}]的绩效数据不存在", userId); | |
66 | 66 | return BigDecimal.ZERO; |
67 | 67 | } |
68 | 68 | KpiPool kpiPool = optionalKpiPool.get(); | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateService.java
... | ... | @@ -9,7 +9,6 @@ import cn.fw.morax.common.utils.ThreadPoolUtil; |
9 | 9 | import cn.fw.morax.domain.bo.eval.*; |
10 | 10 | import cn.fw.morax.domain.bo.kpi.EvalGroupCalculableRankBO; |
11 | 11 | import cn.fw.morax.domain.db.eval.*; |
12 | -import cn.fw.morax.domain.dto.salary.SalaryExtraDTO; | |
13 | 12 | import cn.fw.morax.domain.enums.*; |
14 | 13 | import cn.fw.morax.service.biz.CommonService; |
15 | 14 | import cn.fw.morax.service.biz.calculator.eval.kpi.EvalKpiBaseCalculator; |
... | ... | @@ -40,7 +39,6 @@ import java.time.YearMonth; |
40 | 39 | import java.util.*; |
41 | 40 | import java.util.concurrent.*; |
42 | 41 | import java.util.concurrent.atomic.AtomicReference; |
43 | -import java.util.function.Consumer; | |
44 | 42 | import java.util.stream.Collectors; |
45 | 43 | |
46 | 44 | /** |
... | ... | @@ -169,20 +167,22 @@ public class EvalCalculateService { |
169 | 167 | Map<Long, List<EvalGroup>> stageEvalGroupMap = evalGroups.stream().collect(Collectors.groupingBy(EvalGroup::getEvalGroupRankStageId)); |
170 | 168 | //计算考评得分 |
171 | 169 | CompletableFuture<Void>[] futuresArr = evalGroups.stream().map(evalGroup -> CompletableFuture.runAsync(() -> { |
172 | - Long start = System.currentTimeMillis(); | |
170 | + if (Boolean.FALSE.equals(this.checkEvalConfigValid(evalGroup, dataDate))){ | |
171 | + return; | |
172 | + } | |
173 | + final EvalGroupRankConfigBO calcConfigBo = this.getEvalCalcConfig(evalGroup, dataDate); | |
174 | + final Long start = System.currentTimeMillis(); | |
173 | 175 | log.info(" 考评组计算:考评组进行计算:{}", evalGroup.getId()); |
174 | 176 | TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition); |
175 | - final Long evalGroupRankStageId = evalGroup.getEvalGroupRankStageId(); | |
176 | - final Long evalGroupId = evalGroup.getId(); | |
177 | 177 | try { |
178 | - EvalGroupCalcParamsBO calcDateParam = this.getCalcDate(evalGroupRankStageId, dataDate, EvalCalStageDimEnum.STAGE_STAGE); | |
179 | - calculateEvalGroup(evalGroupId, calcDateParam, EvalScopeEnum.STAFF); | |
180 | - calculateEvalGroup(evalGroupId, calcDateParam, EvalScopeEnum.SHOP); | |
178 | + EvalGroupCalcParamsBO calcDateParam = this.getCalcDate(calcConfigBo, dataDate, EvalCalStageDimEnum.STAGE_STAGE); | |
179 | + calculateEvalGroup(calcConfigBo, calcDateParam, EvalScopeEnum.STAFF); | |
180 | + calculateEvalGroup(calcConfigBo, calcDateParam, EvalScopeEnum.SHOP); | |
181 | 181 | //多阶段才需要计算-阶段累计 |
182 | 182 | if (calcDateParam.getMultiStage()) { |
183 | - EvalGroupCalcParamsBO calcDateParamM = this.getCalcDate(evalGroupRankStageId, dataDate, EvalCalStageDimEnum.STAGE_MONTH); | |
184 | - calculateEvalGroup(evalGroupId, calcDateParamM, EvalScopeEnum.STAFF); | |
185 | - calculateEvalGroup(evalGroupId, calcDateParamM, EvalScopeEnum.SHOP); | |
183 | + EvalGroupCalcParamsBO calcDateParamM = this.getCalcDate(calcConfigBo, dataDate, EvalCalStageDimEnum.STAGE_MONTH); | |
184 | + calculateEvalGroup(calcConfigBo, calcDateParamM, EvalScopeEnum.STAFF); | |
185 | + calculateEvalGroup(calcConfigBo, calcDateParamM, EvalScopeEnum.SHOP); | |
186 | 186 | } |
187 | 187 | platformTransactionManager.commit(transactionStatus); |
188 | 188 | log.info(" 考评组计算:考评组计算完成:{},耗时:{} s", evalGroup.getId(), TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start)); |
... | ... | @@ -197,19 +197,24 @@ public class EvalCalculateService { |
197 | 197 | this.calcEvalRank(evalGroupRankId, dataDate); |
198 | 198 | //计算考评奖惩 |
199 | 199 | CompletableFuture<List<EvalRewardPushSalaryBO>>[] futuresRewardArr = stageEvalGroupMap.entrySet().stream().map(stage -> CompletableFuture.supplyAsync(() -> { |
200 | - Long start = System.currentTimeMillis(); | |
201 | - log.info("考评奖惩计算:考评奖惩开始进行计算,考评排名组:{}", evalGroupRankId); | |
200 | + final Long evalGroupRankStageId = stage.getKey(); | |
201 | + if (Boolean.FALSE.equals(this.checkEvalRewardConfigValid(evalGroupRankStageId, dataDate))){ | |
202 | + return new ArrayList<>(); | |
203 | + } | |
204 | + final EvalGroupRankConfigBO calcConfigBo = this.getEvalRewardCalcConfig(evalGroupRankStageId, dataDate); | |
205 | + final Long start = System.currentTimeMillis(); | |
206 | + log.info("考评奖惩计算:考评奖惩开始进行计算,考评阶段:{}", evalGroupRankStageId); | |
202 | 207 | List<EvalRewardPushSalaryBO> res = new ArrayList<>(); |
203 | 208 | TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition); |
204 | 209 | try { |
205 | - res = calculateEvalStageReward(evalGroupRankId, stage, dataDate); | |
210 | + res = calculateEvalStageReward(calcConfigBo, stage, dataDate); | |
206 | 211 | platformTransactionManager.commit(transactionStatus); |
207 | 212 | } catch (Exception ex) { |
208 | 213 | platformTransactionManager.rollback(transactionStatus); |
209 | 214 | log.error("计算考评奖惩数据失败:{}", bo, ex); |
210 | 215 | success.set(Boolean.FALSE); |
211 | 216 | } |
212 | - log.info("考评奖惩计算:考评奖惩计算完成,考评排名组:{},耗时:{} s", evalGroupRankId, TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start)); | |
217 | + log.info("考评奖惩计算:考评奖惩计算完成,考评阶段:{},耗时:{} s", evalGroupRankStageId, TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start)); | |
213 | 218 | return res; |
214 | 219 | }, threadPool)).<CompletableFuture<List<EvalRewardPushSalaryBO>>>toArray(CompletableFuture[]::new); |
215 | 220 | CompletableFuture.allOf(futuresRewardArr).join(); |
... | ... | @@ -218,14 +223,14 @@ public class EvalCalculateService { |
218 | 223 | overflowsList.add(str); |
219 | 224 | } else { |
220 | 225 | //计算排名、报表数据抽取 |
221 | - //考评奖惩 | |
226 | + //考评奖惩推送薪酬 | |
222 | 227 | this.cacheEvalRewardPushSalary(futuresRewardArr); |
223 | 228 | //考评门店角色奖惩 |
224 | 229 | this.cacheEvalShopRoleRewardPushSalary(evalGroupRankId, dataDate); |
225 | 230 | //保存计算结果 |
226 | 231 | this.cacheSaveCalcResult(evalCalcId, bo.getEvalGroupRankId(), dataDate, evalGroups); |
227 | 232 | evalCalcService.modifyStatus(evalCalcId, EvalCalcStatusEnum.SAVE_CALC_RESULT); |
228 | - //是否分配奖惩 | |
233 | + //是否分配门店奖惩 | |
229 | 234 | this.cacheDistShopReward(evalCalcId, evalGroupRankId, dataDate); |
230 | 235 | } |
231 | 236 | } catch (Exception re) { |
... | ... | @@ -251,6 +256,62 @@ public class EvalCalculateService { |
251 | 256 | stringRedisTemplate.opsForSet().add(evalCalculationVal.getCacheSaveCalcResult(), json); |
252 | 257 | } |
253 | 258 | |
259 | + public Boolean checkEvalConfigValid(EvalGroup evalGroup, LocalDate calcDate) { | |
260 | + if (PublicUtil.isEmpty(evalGroup)) { | |
261 | + return Boolean.FALSE; | |
262 | + } | |
263 | + EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroup.getEvalGroupRankStageId(), calcDate); | |
264 | + if (PublicUtil.isEmpty(evalGroupRankStage)) { | |
265 | + log.error("考评排名组阶段[{}]不存在,终止计算!", JSON.toJSONString(evalGroup)); | |
266 | + return Boolean.FALSE; | |
267 | + } | |
268 | + EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroup.getEvalGroupRankId()); | |
269 | + if (PublicUtil.isEmpty(evalGroupRank)) { | |
270 | + log.error("考评组[{}]排名组不存在,终止计算!", evalGroup.getEvalGroupRankId()); | |
271 | + return Boolean.FALSE; | |
272 | + } | |
273 | + return Boolean.TRUE; | |
274 | + } | |
275 | + | |
276 | + public EvalGroupRankConfigBO getEvalCalcConfig(EvalGroup evalGroup, LocalDate calcDate) { | |
277 | + EvalGroupRankConfigBO rankConfigBO = new EvalGroupRankConfigBO(); | |
278 | + EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroup.getEvalGroupRankId()); | |
279 | + EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroup.getEvalGroupRankStageId(), calcDate); | |
280 | + | |
281 | + rankConfigBO.setEvalGroupRank(evalGroupRank); | |
282 | + rankConfigBO.setEvalGroupRankStage(evalGroupRankStage); | |
283 | + rankConfigBO.setEvalGroup(evalGroup); | |
284 | + return rankConfigBO; | |
285 | + } | |
286 | + | |
287 | + public Boolean checkEvalRewardConfigValid(Long evalGroupRankStageId, LocalDate calcDate) { | |
288 | + if (PublicUtil.isEmpty(evalGroupRankStageId)) { | |
289 | + return Boolean.FALSE; | |
290 | + } | |
291 | + EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroupRankStageId, calcDate); | |
292 | + if (PublicUtil.isEmpty(evalGroupRankStage)) { | |
293 | + log.error("考评排名组阶段[{}]不存在,终止计算!", JSON.toJSONString(evalGroupRankStageId)); | |
294 | + return Boolean.FALSE; | |
295 | + } | |
296 | + EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroupRankStage.getEvalGroupRankId()); | |
297 | + if (PublicUtil.isEmpty(evalGroupRank)) { | |
298 | + log.error("考评组[{}]排名组不存在,终止计算!", evalGroupRankStage.getEvalGroupRankId()); | |
299 | + return Boolean.FALSE; | |
300 | + } | |
301 | + return Boolean.TRUE; | |
302 | + } | |
303 | + | |
304 | + public EvalGroupRankConfigBO getEvalRewardCalcConfig(Long evalGroupRankStageId, LocalDate calcDate) { | |
305 | + EvalGroupRankConfigBO rankConfigBO = new EvalGroupRankConfigBO(); | |
306 | + EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroupRankStageId, calcDate); | |
307 | + EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroupRankStage.getEvalGroupRankId()); | |
308 | + | |
309 | + rankConfigBO.setEvalGroupRank(evalGroupRank); | |
310 | + rankConfigBO.setEvalGroupRankStage(evalGroupRankStage); | |
311 | + return rankConfigBO; | |
312 | + } | |
313 | + | |
314 | + | |
254 | 315 | private void cacheEvalRewardPushSalary(CompletableFuture<List<EvalRewardPushSalaryBO>>[] futuresRewardArr) { |
255 | 316 | List<EvalRewardPushSalaryBO> evalRewardPushSalaryBOS = new ArrayList<>(); |
256 | 317 | Arrays.stream(futuresRewardArr).forEach(future -> { |
... | ... | @@ -298,17 +359,9 @@ public class EvalCalculateService { |
298 | 359 | * @param localDate |
299 | 360 | * @return |
300 | 361 | */ |
301 | - public EvalGroupCalcParamsBO getCalcDate(Long evalGroupRankStageId, final LocalDate localDate,EvalCalStageDimEnum stageDimEnum) { | |
302 | - EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroupRankStageId, localDate); | |
303 | - if (Objects.isNull(evalGroupRankStage)) { | |
304 | - log.error("考评排名组阶段[{}]不存在,终止计算!", evalGroupRankStageId); | |
305 | - return null; | |
306 | - } | |
307 | - EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroupRankStage.getEvalGroupRankId()); | |
308 | - if (Objects.isNull(evalGroupRank)) { | |
309 | - log.error("考评排名组[{}]不存在,终止计算!", evalGroupRankStage.getEvalGroupRankId()); | |
310 | - return null; | |
311 | - } | |
362 | + public EvalGroupCalcParamsBO getCalcDate(EvalGroupRankConfigBO calcConfigBo, final LocalDate localDate,EvalCalStageDimEnum stageDimEnum) { | |
363 | + EvalGroupRankStage evalGroupRankStage = calcConfigBo.getEvalGroupRankStage(); | |
364 | + EvalGroupRank evalGroupRank = calcConfigBo.getEvalGroupRank(); | |
312 | 365 | EvalGroupCalcParamsBO paramsBO = new EvalGroupCalcParamsBO(); |
313 | 366 | LocalDate firstStageStartTime = evalGroupRankStageService.getRankStartTime(evalGroupRank.getId(), evalGroupRank.getPeriod(), localDate); |
314 | 367 | paramsBO.setCalcMonthBeginDate(firstStageStartTime); |
... | ... | @@ -330,12 +383,11 @@ public class EvalCalculateService { |
330 | 383 | return paramsBO; |
331 | 384 | } |
332 | 385 | |
333 | - public void calculateEvalGroup(final Long evalGroupId, final EvalGroupCalcParamsBO calcDateParam, EvalScopeEnum scopeType) { | |
334 | - if (Objects.isNull(calcDateParam)){ | |
335 | - log.error("参数不够,终止计算!"); | |
336 | - return; | |
337 | - } | |
338 | - List<EvalGroupUserShop> userShops = this.buildEvalGroupObj(evalGroupId, calcDateParam, scopeType); | |
386 | + public void calculateEvalGroup(EvalGroupRankConfigBO calcConfigBo, final EvalGroupCalcParamsBO calcDateParam, EvalScopeEnum scopeType) { | |
387 | + EvalGroup evalGroup = calcConfigBo.getEvalGroup(); | |
388 | + | |
389 | + final Long evalGroupId = evalGroup.getId(); | |
390 | + List<EvalGroupUserShop> userShops = this.buildEvalGroupObj(calcConfigBo, calcDateParam, scopeType); | |
339 | 391 | if (PublicUtil.isEmpty(userShops)) { |
340 | 392 | log.error("考评组[{}]人员为空,终止计算!", evalGroupId); |
341 | 393 | return; |
... | ... | @@ -356,28 +408,22 @@ public class EvalCalculateService { |
356 | 408 | } |
357 | 409 | } |
358 | 410 | |
359 | - public List<EvalRewardPushSalaryBO> calculateEvalStageReward(final Long evalGroupRankId, | |
411 | + public List<EvalRewardPushSalaryBO> calculateEvalStageReward(EvalGroupRankConfigBO calcConfigBo, | |
360 | 412 | Map.Entry<Long, List<EvalGroup>> stageEvalGroupEntry, |
361 | 413 | LocalDate dataDate) { |
362 | 414 | final Long evalGroupRankStageId = stageEvalGroupEntry.getKey(); |
363 | 415 | final List<EvalGroup> evalGroups = stageEvalGroupEntry.getValue(); |
364 | - EvalGroupCalcParamsBO calcDateParam = this.getCalcDate(evalGroupRankStageId, dataDate, EvalCalStageDimEnum.STAGE_STAGE); | |
365 | - if (Objects.isNull(calcDateParam)){ | |
366 | - log.error("参数不够,终止计算!"); | |
367 | - return new ArrayList<>(); | |
368 | - } | |
416 | + EvalGroupCalcParamsBO calcDateParam = this.getCalcDate(calcConfigBo, dataDate, EvalCalStageDimEnum.STAGE_STAGE); | |
369 | 417 | final LocalDate calcEndDate = calcDateParam.getCalcEndDate(); |
370 | 418 | final Date date = DateUtil.localDateTime2Date(calcDateParam.getCalcEndDate().atTime(23, 23, 59)); |
371 | - EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroupRankStageId, calcEndDate); | |
372 | - if (Objects.isNull(evalGroupRankStage)) { | |
373 | - log.error("考评排名组阶段[{}]不存在,终止计算!", evalGroupRankStageId); | |
374 | - return new ArrayList<>(); | |
375 | - } | |
419 | + EvalGroupRank evalGroupRank = calcConfigBo.getEvalGroupRank(); | |
420 | + EvalGroupRankStage evalGroupRankStage = calcConfigBo.getEvalGroupRankStage(); | |
421 | + final Long evalGroupRankId = evalGroupRank.getId(); | |
376 | 422 | |
377 | 423 | List<EvalRewardPushSalaryBO> evalRewards = new ArrayList<>(); |
378 | 424 | for (EvalScopeEnum scopeType : EvalScopeEnum.values()) { |
379 | 425 | List<EvalGroupRewardDimBO> rewardDims = this.getRewardBOS(evalGroupRankStageId, scopeType); |
380 | - List<EvalGroupUserShop> userShops = this.getRewardObjs(calcDateParam, evalGroupRankStageId , evalGroups, scopeType); | |
426 | + List<EvalGroupUserShop> userShops = this.getRewardObjs(calcConfigBo, calcDateParam, evalGroupRankStageId , evalGroups, scopeType); | |
381 | 427 | if (PublicUtil.isEmpty(userShops)) { |
382 | 428 | log.error("考评阶段[{}]人员为空,终止计算!", evalGroupRankStageId); |
383 | 429 | continue; |
... | ... | @@ -697,53 +743,25 @@ public class EvalCalculateService { |
697 | 743 | } |
698 | 744 | |
699 | 745 | /** |
700 | - * @param evalGroupId | |
701 | 746 | * @param calcDateParam .getCalcEndDate() <=阶段的截止时间的一个计算时间 |
702 | 747 | * @param scopeType |
703 | 748 | * @return |
704 | 749 | */ |
705 | - public List<EvalGroupUserShop> buildEvalGroupObj(Long evalGroupId, EvalGroupCalcParamsBO calcDateParam, EvalScopeEnum scopeType) { | |
706 | - EvalGroup evalGroup = evalGroupService.getById(evalGroupId); | |
707 | - if (Objects.isNull(evalGroup)) { | |
708 | - log.error("考评组[{}]不存在,终止计算!", evalGroupId); | |
709 | - return new ArrayList<>(); | |
710 | - } | |
750 | + public List<EvalGroupUserShop> buildEvalGroupObj(EvalGroupRankConfigBO calcConfigBo, EvalGroupCalcParamsBO calcDateParam, EvalScopeEnum scopeType) { | |
751 | + final EvalGroupRank evalGroupRank = calcConfigBo.getEvalGroupRank(); | |
752 | + final EvalGroupRankStage evalGroupRankStage = calcConfigBo.getEvalGroupRankStage(); | |
753 | + final EvalGroup evalGroup = calcConfigBo.getEvalGroup(); | |
711 | 754 | final Long groupId = evalGroup.getGroupId(); |
712 | - EvalGroupRankStage evalGroupRankStage = evalGroupRankStageService.getByIdAndSetTime(evalGroup.getEvalGroupRankStageId(), calcDateParam.getCalcEndDate()); | |
713 | - if (Objects.isNull(evalGroupRankStage)) { | |
714 | - log.error("考评排名组阶段[{}]不存在,终止计算!", JSON.toJSONString(evalGroup)); | |
715 | - return new ArrayList<>(); | |
716 | - } | |
717 | - EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroup.getEvalGroupRankId()); | |
718 | - if (Objects.isNull(evalGroupRank)) { | |
719 | - log.error("考评组[{}]排名组不存在,终止计算!", evalGroup.getEvalGroupRankId()); | |
720 | - return new ArrayList<>(); | |
721 | - } | |
722 | 755 | |
723 | 756 | List<EvalGroupUserShop> userShops = new ArrayList<>(); |
724 | 757 | if (EvalScopeEnum.STAFF.equals(scopeType)) { |
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) | |
758 | + List<EvalUserPool> pools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery() | |
759 | + .eq(EvalUserPool::getEvalGroupRankStageId, evalGroupRankStage.getId()) | |
760 | + .eq(EvalUserPool::getMonthly, YearMonth.from(calcDateParam.getCalcEndDate())) | |
761 | + .eq(EvalUserPool::getYn, Boolean.TRUE) | |
739 | 762 | ); |
740 | - if (PublicUtil.isNotEmpty(turnPositiveUsers)) { | |
741 | - users.addAll(turnPositiveUsers); | |
742 | - } | |
743 | - Map<Long, EvalUserPool> userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroupRankStage, users, calcDateParam.getCalcEndDate(), scopeType); | |
744 | - for (EvalGroupUser user : users) { | |
745 | - EvalUserPool userPool = userPoolMap.get(user.getUserId()); | |
746 | - userShops.add(convertBO(user, userPool, evalGroupRank, evalGroupRankStage,calcDateParam, scopeType)); | |
763 | + for (EvalUserPool userPool : pools) { | |
764 | + userShops.add(this.convertBO(userPool, evalGroupRank, evalGroupRankStage,calcDateParam, scopeType)); | |
747 | 765 | } |
748 | 766 | return userShops; |
749 | 767 | } |
... | ... | @@ -753,8 +771,7 @@ public class EvalCalculateService { |
753 | 771 | List<Long> calcShopIds = commonService.filterInvalidShop(groupId, calcDateParam.getCalcEndDate(), evalGroup.getShopIds()); |
754 | 772 | for (Long shopId : calcShopIds) { |
755 | 773 | EvalShopPool shopPool = shopPoolBOMap.get(shopId); |
756 | -// Boolean ignored = ! distShopIds.contains(shopId); | |
757 | - userShops.add(this.convertBO(shopPool, evalGroup, evalGroupRank, evalGroupRankStage, calcDateParam)); | |
774 | + userShops.add(this.convertShopBO(shopPool, evalGroup, evalGroupRank, evalGroupRankStage, calcDateParam)); | |
758 | 775 | } |
759 | 776 | return userShops; |
760 | 777 | } |
... | ... | @@ -799,25 +816,26 @@ public class EvalCalculateService { |
799 | 816 | Map<Long, EvalUserPool> userPoolMap = evalPoolCommonService.inspectionUserPoolMap(evalGroupRankStage, users, calcDateParam.getCalcEndDate(), scopeType); |
800 | 817 | for (EvalGroupUser user : users) { |
801 | 818 | EvalUserPool userPool = userPoolMap.get(user.getUserId()); |
802 | - userShops.add(convertBO(user, userPool, evalGroupRank, evalGroupRankStage,calcDateParam, EvalScopeEnum.MANAGEMENT)); | |
819 | + userShops.add(convertBO(userPool, evalGroupRank, evalGroupRankStage,calcDateParam, EvalScopeEnum.MANAGEMENT)); | |
803 | 820 | } |
804 | 821 | return userShops; |
805 | 822 | } |
806 | 823 | |
807 | - public List<EvalGroupUserShop> getRewardObjs(EvalGroupCalcParamsBO calcDateParam, Long evalGroupRankStageId , List<EvalGroup> evalGroups, EvalScopeEnum scopeType) { | |
824 | + public List<EvalGroupUserShop> getRewardObjs(EvalGroupRankConfigBO calcConfigBo, EvalGroupCalcParamsBO calcDateParam, Long evalGroupRankStageId , List<EvalGroup> evalGroups, EvalScopeEnum scopeType) { | |
808 | 825 | List<EvalGroupUserShop> userShops = Lists.newArrayListWithCapacity(80); |
809 | 826 | if (EvalScopeEnum.MANAGEMENT.equals(scopeType)) { |
810 | 827 | userShops = this.buildManagerEvalGroupObj(evalGroupRankStageId, calcDateParam, scopeType); |
811 | - return userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())) | |
828 | + return userShops.stream().filter(userShop -> Boolean.TRUE.equals(userShop.getInclusion())) | |
812 | 829 | .collect(Collectors.toList()); |
813 | 830 | } |
814 | 831 | |
815 | - final List<Long> evalGroupIds = evalGroups.stream().map(EvalGroup::getId).collect(Collectors.toList()); | |
816 | - for (Long evalGroupId : evalGroupIds) { | |
817 | - List<EvalGroupUserShop> evalGroupUserShops = this.buildEvalGroupObj(evalGroupId, calcDateParam, scopeType); | |
832 | + //普通岗位、门店 奖惩对象 | |
833 | + for (EvalGroup evalGroup : evalGroups) { | |
834 | + calcConfigBo.setEvalGroup(evalGroup); | |
835 | + List<EvalGroupUserShop> evalGroupUserShops = this.buildEvalGroupObj(calcConfigBo, calcDateParam, scopeType); | |
818 | 836 | if (PublicUtil.isNotEmpty(evalGroupUserShops)) { |
819 | 837 | List<EvalGroupUserShop> calcKpiEvalGroupUserShops = evalGroupUserShops.stream() |
820 | - .filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())) | |
838 | + .filter(userShop -> Boolean.TRUE.equals(userShop.getInclusion())) | |
821 | 839 | .collect(Collectors.toList()); |
822 | 840 | if (PublicUtil.isNotEmpty(calcKpiEvalGroupUserShops)) { |
823 | 841 | userShops.addAll(calcKpiEvalGroupUserShops); |
... | ... | @@ -1002,21 +1020,21 @@ public class EvalCalculateService { |
1002 | 1020 | } |
1003 | 1021 | } |
1004 | 1022 | |
1005 | - public List<EvalGroupUserShop> filterUserShops(EvalGroupRewardDimBO dim, EvalScopeEnum scopeType, List<EvalGroupUserShop> userShops) { | |
1006 | - if (EvalScopeEnum.STAFF.equals(scopeType)) { | |
1007 | - return userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList()); | |
1008 | - } | |
1009 | - List<EvalGroupUserShop> filterUserShops = new ArrayList<>(); | |
1023 | +// public List<EvalGroupUserShop> filterUserShops(EvalGroupRewardDimBO dim, EvalScopeEnum scopeType, List<EvalGroupUserShop> userShops) { | |
1010 | 1024 | // if (EvalScopeEnum.STAFF.equals(scopeType)) { |
1011 | -// filterUserShops = userShops.stream().filter(userShop -> dim.getPostIds().contains(userShop.getPostId())).collect(Collectors.toList()); | |
1012 | -// } else { | |
1025 | +// return userShops.stream().filter(userShop -> Boolean.FALSE.equals(userShop.getIgnored())).collect(Collectors.toList()); | |
1026 | +// } | |
1027 | +// List<EvalGroupUserShop> filterUserShops = new ArrayList<>(); | |
1028 | +//// if (EvalScopeEnum.STAFF.equals(scopeType)) { | |
1029 | +//// filterUserShops = userShops.stream().filter(userShop -> dim.getPostIds().contains(userShop.getPostId())).collect(Collectors.toList()); | |
1030 | +//// } else { | |
1031 | +//// filterUserShops = userShops.stream().filter(userShop -> dim.getShopIds().contains(userShop.getShopId())).collect(Collectors.toList()); | |
1032 | +//// } | |
1033 | +// if (EvalScopeEnum.SHOP.equals(scopeType)) { | |
1013 | 1034 | // filterUserShops = userShops.stream().filter(userShop -> dim.getShopIds().contains(userShop.getShopId())).collect(Collectors.toList()); |
1014 | 1035 | // } |
1015 | - if (EvalScopeEnum.SHOP.equals(scopeType)) { | |
1016 | - filterUserShops = userShops.stream().filter(userShop -> dim.getShopIds().contains(userShop.getShopId())).collect(Collectors.toList()); | |
1017 | - } | |
1018 | - return filterUserShops; | |
1019 | - } | |
1036 | +// return filterUserShops; | |
1037 | +// } | |
1020 | 1038 | |
1021 | 1039 | /** |
1022 | 1040 | * 计算绩效金额 |
... | ... | @@ -1354,16 +1372,15 @@ public class EvalCalculateService { |
1354 | 1372 | return poolDetail; |
1355 | 1373 | } |
1356 | 1374 | |
1357 | - public EvalGroupUserShop convertBO(EvalGroupUser user, | |
1358 | - EvalUserPool userPool, | |
1375 | + public EvalGroupUserShop convertBO(EvalUserPool userPool, | |
1359 | 1376 | EvalGroupRank evalGroupRank, |
1360 | 1377 | EvalGroupRankStage evalGroupRankStage, |
1361 | 1378 | EvalGroupCalcParamsBO calcDateParam, |
1362 | 1379 | EvalScopeEnum evalScopeType) { |
1363 | 1380 | EvalGroupUserShop userShop = new EvalGroupUserShop(); |
1364 | - userShop.setName(user.getUserName()); | |
1381 | + userShop.setName(userPool.getUserName()); | |
1365 | 1382 | userShop.setScopeType(evalScopeType); |
1366 | - userShop.setEvalGroupId(user.getEvalGroupId()); | |
1383 | + userShop.setEvalGroupId(userPool.getEvalGroupId()); | |
1367 | 1384 | userShop.setEvalGroupRankId(evalGroupRankStage.getEvalGroupRankId()); |
1368 | 1385 | userShop.setEvalGroupRankStageId(evalGroupRankStage.getId()); |
1369 | 1386 | userShop.setPoolId(userPool.getId()); |
... | ... | @@ -1372,14 +1389,14 @@ public class EvalCalculateService { |
1372 | 1389 | userShop.setShopId(userPool.getShopId()); |
1373 | 1390 | userShop.setScoreRatio(Optional.ofNullable(userPool.getScoreRatio()).orElse(BigDecimal.ZERO)); |
1374 | 1391 | userShop.setStageAccumulationScoreRatio(Optional.ofNullable(userPool.getStageAccumulationScoreRatio()).orElse(BigDecimal.ZERO)); |
1375 | - userShop.setReferId(user.getUserId()); | |
1392 | + userShop.setReferId(userPool.getUserId()); | |
1376 | 1393 | userShop.setBeginDate(calcDateParam.getCalcBeginDate()); |
1377 | - userShop.setDataDate(user.getDataDate()); | |
1394 | + userShop.setDataDate(userPool.getDataDate()); | |
1378 | 1395 | userShop.setMultiStage(evalGroupRank.getMultiStage()); |
1379 | - userShop.setGroupId(user.getGroupId()); | |
1396 | + userShop.setGroupId(userPool.getGroupId()); | |
1380 | 1397 | userShop.setScore(BigDecimal.ZERO); |
1381 | 1398 | // userShop.setReward(BigDecimal.ZERO); |
1382 | - userShop.setIgnored(user.getIgnored()); | |
1399 | + userShop.setInclusion(userPool.getInclusion()); | |
1383 | 1400 | userShop.setStageDimEnum(calcDateParam.getStageDimEnum()); |
1384 | 1401 | if (PublicUtil.isNotEmpty(calcDateParam.getCalcMonthBeginDate())) { |
1385 | 1402 | userShop.setCalcMonthBeginDate(calcDateParam.getCalcMonthBeginDate()); |
... | ... | @@ -1412,7 +1429,7 @@ public class EvalCalculateService { |
1412 | 1429 | // return userShop; |
1413 | 1430 | // } |
1414 | 1431 | |
1415 | - public EvalGroupUserShop convertBO(EvalShopPool shopPool, | |
1432 | + public EvalGroupUserShop convertShopBO(EvalShopPool shopPool, | |
1416 | 1433 | EvalGroup evalGroup, |
1417 | 1434 | EvalGroupRank evalGroupRank, |
1418 | 1435 | EvalGroupRankStage evalGroupRankStage, |
... | ... | @@ -1438,7 +1455,7 @@ public class EvalCalculateService { |
1438 | 1455 | userShop.setMultiStage(evalGroupRank.getMultiStage()); |
1439 | 1456 | userShop.setGroupId(evalGroup.getGroupId()); |
1440 | 1457 | // userShop.setIgnored(ignored); |
1441 | - userShop.setIgnored(Boolean.FALSE); | |
1458 | + userShop.setInclusion(Boolean.TRUE); | |
1442 | 1459 | userShop.setScore(BigDecimal.ZERO); |
1443 | 1460 | userShop.setStageDimEnum(calcDateParam.getStageDimEnum()); |
1444 | 1461 | if (PublicUtil.isNotEmpty(calcDateParam.getCalcMonthBeginDate())) { | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalCalculateTaskService.java
... | ... | @@ -13,8 +13,6 @@ import cn.fw.morax.domain.bo.eval.EvalGroupCalculableBO; |
13 | 13 | import cn.fw.morax.domain.bo.eval.EvalRankReportBO; |
14 | 14 | import cn.fw.morax.domain.db.eval.*; |
15 | 15 | import cn.fw.morax.domain.db.kpi.Indicators; |
16 | -import cn.fw.morax.domain.db.kpi.KpiGroupUser; | |
17 | -import cn.fw.morax.domain.db.kpi.KpiPool; | |
18 | 16 | import cn.fw.morax.domain.db.kpi.KpiStageMqLog; |
19 | 17 | import cn.fw.morax.domain.enums.*; |
20 | 18 | import cn.fw.morax.rpc.ehr.EhrRpcService; |
... | ... | @@ -22,6 +20,7 @@ import cn.fw.morax.rpc.ehr.dto.ManagerDTO; |
22 | 20 | import cn.fw.morax.rpc.ehr.dto.ManagerStaffDTO; |
23 | 21 | import cn.fw.morax.sdk.dto.common.IndicatorReportTypeEnum; |
24 | 22 | import cn.fw.morax.sdk.dto.kpi.KpiStageReportNoticeMQ; |
23 | +import cn.fw.morax.service.biz.CommonService; | |
25 | 24 | import cn.fw.morax.service.component.KpiStageIndicatorReportProducer; |
26 | 25 | import cn.fw.morax.service.data.eval.*; |
27 | 26 | import cn.fw.morax.service.data.kpi.IndicatorsService; |
... | ... | @@ -42,6 +41,7 @@ import org.springframework.transaction.TransactionDefinition; |
42 | 41 | import org.springframework.transaction.TransactionStatus; |
43 | 42 | import org.springframework.transaction.annotation.Transactional; |
44 | 43 | |
44 | +import java.math.BigDecimal; | |
45 | 45 | import java.time.LocalDate; |
46 | 46 | import java.time.LocalDateTime; |
47 | 47 | import java.time.YearMonth; |
... | ... | @@ -90,6 +90,7 @@ public class EvalCalculateTaskService { |
90 | 90 | private final IndicatorsService indicatorsService; |
91 | 91 | private final EvalGroupService evalGroupService; |
92 | 92 | private final EvalCalcService evalCalcService; |
93 | + private final CommonService commonService; | |
93 | 94 | private final EhrRpcService ehrRpcService; |
94 | 95 | |
95 | 96 | /** |
... | ... | @@ -121,11 +122,11 @@ public class EvalCalculateTaskService { |
121 | 122 | if (EvalCalcStatusEnum.COLLECT_STAGE_DATA.equals(evalCalc.getStatus())) { |
122 | 123 | //多阶段先抽取指标数据 |
123 | 124 | if (evalCalc.getMultiStage()) { |
124 | - this.cacheStageIndicator(evalCalcId, evalGroupRankId, evalGroupIds, Boolean.TRUE, localDate); | |
125 | + this.cacheStageIndicator(evalCalcId, evalGroupRankId, Boolean.TRUE, localDate); | |
125 | 126 | return; |
126 | 127 | } |
127 | 128 | //单阶段直接计算 |
128 | - this.cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), new HashSet<>(evalCalc.getEvalGroupIds()), evalCalc.getCalcDate()); | |
129 | + this.cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), evalCalc.getCalcDate()); | |
129 | 130 | return; |
130 | 131 | } |
131 | 132 | //抽取人员信息 |
... | ... | @@ -170,11 +171,11 @@ public class EvalCalculateTaskService { |
170 | 171 | if (EvalCalcStatusEnum.COLLECT_STAGE_DATA.equals(evalCalc.getStatus())) { |
171 | 172 | //多阶段先抽取指标数据 |
172 | 173 | if (evalCalc.getMultiStage()) { |
173 | - this.cacheStageIndicator(evalCalcId, evalGroupRankId, evalGroupIds, Boolean.FALSE, localDate); | |
174 | + this.cacheStageIndicator(evalCalcId, evalGroupRankId, Boolean.FALSE, localDate); | |
174 | 175 | continue; |
175 | 176 | } |
176 | 177 | //单阶段直接计算 |
177 | - this.cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), new HashSet<>(evalCalc.getEvalGroupIds()), evalCalc.getCalcDate()); | |
178 | + this.cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), evalCalc.getCalcDate()); | |
178 | 179 | continue; |
179 | 180 | } |
180 | 181 | //抽取人员信息 |
... | ... | @@ -259,7 +260,12 @@ public class EvalCalculateTaskService { |
259 | 260 | continue; |
260 | 261 | } |
261 | 262 | try { |
262 | - this.extractEvalUser(bo); | |
263 | + //实时计算抽取每天的人员数据 | |
264 | + if (Boolean.TRUE.equals(bo.getRealTimeCalc())) { | |
265 | + this.extractStageEveryDateEvalUser(bo); | |
266 | + } else { | |
267 | + this.extractEvalUser(bo); | |
268 | + } | |
263 | 269 | } catch (Exception re) { |
264 | 270 | log.error("考评人员抽取异常", re); |
265 | 271 | bo.getAtomicInteger().incrementAndGet(); |
... | ... | @@ -304,7 +310,9 @@ public class EvalCalculateTaskService { |
304 | 310 | evalGroupIds.add(evalGroup.getId()); |
305 | 311 | //昨天已经在 阶段结束时间之后 |
306 | 312 | for (Long postId : Optional.ofNullable(evalGroup.getPostIds()).orElse(new ArrayList<>())) { |
307 | - evalGroupUsersForSave.addAll(evalGroupUserBizService.fetchBuildKpiUser(groupId, postId, evalGroup, dataDate)); | |
313 | + List<EvalGroupUser> evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(groupId, postId, evalGroup, dataDate); | |
314 | + this.setMultiStageIgnoreCase(evalGroupRank, stage, evalGroupUsers); | |
315 | + evalGroupUsersForSave.addAll(evalGroupUsers); | |
308 | 316 | } |
309 | 317 | } |
310 | 318 | //管理层人员 |
... | ... | @@ -313,48 +321,206 @@ public class EvalCalculateTaskService { |
313 | 321 | for (Long postId : rewardDim.getPostIds()) { |
314 | 322 | List<EvalGroupUser> manageEvalGroupUsers = evalGroupUserBizService.fetchPostUsers(groupId, postId, rewardDim.getShopIds(), dataDate); |
315 | 323 | 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 | - } | |
324 | + this.initManageEvalUser(manageEvalGroupUsers, evalGroupRankId, evalGroupRankStageId); | |
325 | + this.setMultiStageIgnoreCase(evalGroupRank, stage, manageEvalGroupUsers); | |
322 | 326 | managerEvalGroupUsersForSave.addAll(manageEvalGroupUsers); |
323 | 327 | } |
324 | 328 | } |
325 | 329 | } |
326 | 330 | //去重 |
327 | - List<EvalGroupUser> repeatUsers = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery() | |
328 | - .eq(EvalGroupUser::getEvalGroupRankStageId, evalGroupRankStageId) | |
329 | - .eq(EvalGroupUser::getDataDate, dataDate) | |
330 | - .eq(EvalGroupUser::getYn, Boolean.TRUE) | |
331 | - .select(EvalGroupUser::getId) | |
332 | - ); | |
333 | - if (PublicUtil.isNotEmpty(repeatUsers)) { | |
334 | - evalGroupUserService.removeByIds(repeatUsers.stream().map(EvalGroupUser::getId).collect(Collectors.toSet())); | |
331 | + Set<Long> repeatUserIds = this.queryRepeatUserEvalIds(evalGroupRankStageId, dataDate); | |
332 | + if (PublicUtil.isNotEmpty(repeatUserIds)) { | |
333 | + evalGroupUserService.removeByIds(repeatUserIds); | |
335 | 334 | } |
336 | 335 | if (PublicUtil.isNotEmpty(evalGroupUsersForSave)) { |
337 | 336 | evalGroupUserService.insertBatchSomeColumn(evalGroupUsersForSave); |
338 | - this.updatePoolOtherInfo(evalGroupUsersForSave, EvalScopeEnum.STAFF); | |
337 | + evalPoolCommonService.createUserPools(evalGroupUsersForSave, EvalScopeEnum.STAFF); | |
339 | 338 | } |
340 | 339 | if (PublicUtil.isNotEmpty(managerEvalGroupUsersForSave)) { |
341 | 340 | evalGroupUserService.insertBatchSomeColumn(managerEvalGroupUsersForSave); |
342 | - this.updatePoolOtherInfo(managerEvalGroupUsersForSave, EvalScopeEnum.MANAGEMENT); | |
341 | + evalPoolCommonService.createUserPools(managerEvalGroupUsersForSave, EvalScopeEnum.MANAGEMENT); | |
343 | 342 | } |
344 | 343 | } |
345 | 344 | evalCalcService.modifyStatus(evalCalcId, EvalCalcStatusEnum.COLLECT_STAGE_DATA); |
346 | 345 | //多阶段 |
347 | 346 | if (bo.getMultiStage()) { |
348 | - this.cacheStageIndicator(evalCalcId, evalGroupRankId, evalGroupIds, realTimeCalc, yesterday); | |
347 | + this.cacheStageIndicator(evalCalcId, evalGroupRankId, realTimeCalc, yesterday); | |
348 | + } else { | |
349 | + this.cacheCalcGroupIds(evalCalcId, evalGroupRankId, yesterday); | |
350 | + } | |
351 | + platformTransactionManager.commit(transactionStatus); | |
352 | + } catch (Exception e) { | |
353 | + platformTransactionManager.rollback(transactionStatus); | |
354 | + throw e; | |
355 | + } | |
356 | + | |
357 | + } | |
358 | + | |
359 | + public void extractStageEveryDateEvalUser(EvalExtractUserBO bo) { | |
360 | + final Long evalCalcId = bo.getEvalCalcId(); | |
361 | + final Long evalGroupRankId = bo.getEvalGroupRankId(); | |
362 | + final Boolean realTimeCalc = bo.getRealTimeCalc(); | |
363 | + final LocalDate yesterday = bo.getLocalDate(); | |
364 | + EvalGroupRank evalGroupRank = evalGroupRankService.getById(evalGroupRankId); | |
365 | + if (PublicUtil.isEmpty(evalGroupRank)) { | |
366 | + log.error("考评抽取人员找不到考评排名组信息:{}", JSON.toJSONString(bo)); | |
367 | + return; | |
368 | + } | |
369 | + final Long groupId = evalGroupRank.getGroupId(); | |
370 | + List<EvalGroupRankStage> stages = evalGroupRankStageService.getRankStages(evalGroupRankId, yesterday, realTimeCalc); | |
371 | + TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition); | |
372 | + try { | |
373 | + for (EvalGroupRankStage stage : stages) { | |
374 | + final Long start = System.currentTimeMillis(); | |
375 | + log.info(" 考评抽取历史人员数据:考评排名组阶段id:{}", stage.getId()); | |
376 | + Set<Long> stageRepeatEvalUserIds = new HashSet<>(); | |
377 | + final Long evalGroupRankStageId = stage.getId(); | |
378 | + List<EvalGroupUser> evalGroupUsersForSave = Lists.newArrayListWithCapacity(100); | |
379 | + List<EvalGroupUser> managerEvalGroupUsersForSave = Lists.newArrayListWithCapacity(100); | |
380 | + List<EvalGroup> evalGroups = evalGroupService.list(Wrappers.<EvalGroup>lambdaQuery() | |
381 | + .eq(EvalGroup::getEvalGroupRankStageId, evalGroupRankStageId) | |
382 | + .eq(EvalGroup::getYn, Boolean.TRUE) | |
383 | + ); | |
384 | + LocalDate stageEveryDataTime = stage.getBeginTime(); | |
385 | + //计算时间 在阶段结束时间之后 阶段结束时间 | |
386 | + final LocalDate stageEndTime = yesterday.isAfter(stage.getOverTime()) ? stage.getOverTime() : yesterday; | |
387 | + | |
388 | + //阶段开始时间大于 阶段结束时间 | |
389 | + while (stageEndTime.compareTo(stageEveryDataTime) >= 0) { | |
390 | + log.info("抽取考评排名组人员信息:{},阶段:{},日期:{}", evalGroupRankId, evalGroupRankStageId, stageEveryDataTime); | |
391 | + //先记录 重复员工信息 | |
392 | + stageRepeatEvalUserIds.addAll(this.queryRepeatUserEvalIds(evalGroupRankStageId, stageEveryDataTime)); | |
393 | + //普通岗位员工 | |
394 | + for (EvalGroup evalGroup : evalGroups) { | |
395 | + for (Long postId : Optional.ofNullable(evalGroup.getPostIds()).orElse(new ArrayList<>())) { | |
396 | + List<EvalGroupUser> evalGroupUsers = evalGroupUserBizService.fetchBuildKpiUser(groupId, postId, evalGroup, stageEveryDataTime); | |
397 | + this.setMultiStageIgnoreCase(evalGroupRank, stage, evalGroupUsers); | |
398 | + evalGroupUsersForSave.addAll(evalGroupUsers); | |
399 | + evalPoolCommonService.createUserPools(evalGroupUsers, EvalScopeEnum.STAFF); | |
400 | + } | |
401 | + } | |
402 | + //管理层人员 | |
403 | + List<EvalGroupRewardDim> rewardDims = evalGroupRewardDimService.getManageReward(evalGroupRankStageId); | |
404 | + for (EvalGroupRewardDim rewardDim : rewardDims) { | |
405 | + for (Long postId : rewardDim.getPostIds()) { | |
406 | + List<EvalGroupUser> manageEvalGroupUsers = evalGroupUserBizService.fetchPostUsers(groupId, postId, rewardDim.getShopIds(), stageEveryDataTime); | |
407 | + this.initManageEvalUser(manageEvalGroupUsers, evalGroupRankId, evalGroupRankStageId); | |
408 | + this.setMultiStageIgnoreCase(evalGroupRank, stage, managerEvalGroupUsersForSave); | |
409 | + managerEvalGroupUsersForSave.addAll(manageEvalGroupUsers); | |
410 | + evalPoolCommonService.createUserPools(manageEvalGroupUsers, EvalScopeEnum.MANAGEMENT); | |
411 | + } | |
412 | + } | |
413 | + //日期+1 | |
414 | + stageEveryDataTime = stageEveryDataTime.plusDays(1); | |
415 | + } | |
416 | + //去重 | |
417 | + if (PublicUtil.isNotEmpty(stageRepeatEvalUserIds)) { | |
418 | + evalGroupUserService.removeByIds(stageRepeatEvalUserIds); | |
419 | + } | |
420 | + if (PublicUtil.isNotEmpty(evalGroupUsersForSave)) { | |
421 | + evalGroupUserService.insertBatchSomeColumn(evalGroupUsersForSave); | |
422 | + } | |
423 | + if (PublicUtil.isNotEmpty(managerEvalGroupUsersForSave)) { | |
424 | + evalGroupUserService.insertBatchSomeColumn(managerEvalGroupUsersForSave); | |
425 | + } | |
426 | + log.info(" 考评抽取历史人员数据完成:考评排名组阶段id:{},耗时:{} s", stage.getId(), TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start)); | |
427 | + } | |
428 | + //多阶段 | |
429 | + if (bo.getMultiStage()) { | |
430 | + this.cacheStageIndicator(evalCalcId, evalGroupRankId, realTimeCalc, yesterday); | |
349 | 431 | } else { |
350 | - this.cacheCalcGroupIds(evalCalcId, evalGroupRankId, evalGroupIds, yesterday); | |
432 | + this.cacheCalcGroupIds(evalCalcId, evalGroupRankId, yesterday); | |
351 | 433 | } |
352 | 434 | platformTransactionManager.commit(transactionStatus); |
353 | 435 | } catch (Exception e) { |
354 | 436 | platformTransactionManager.rollback(transactionStatus); |
355 | 437 | throw e; |
356 | 438 | } |
439 | + } | |
440 | + | |
441 | + /** | |
442 | + * 设置阶段忽略原因 | |
443 | + * 1. 阶段内有调岗,不参与考评 | |
444 | + * 2. 阶段内离职,不参与考评 | |
445 | + */ | |
446 | + public void setMultiStageIgnoreCase(EvalGroupRank evalGroupRank, EvalGroupRankStage stage, List<EvalGroupUser> evalGroupUsers) { | |
447 | + if (Boolean.FALSE.equals(evalGroupRank.getMultiStage())) { | |
448 | + return; | |
449 | + } | |
450 | + if (PublicUtil.isEmpty(evalGroupUsers)) { | |
451 | + return; | |
452 | + } | |
453 | + for (EvalGroupUser evalGroupUser : evalGroupUsers) { | |
454 | + final Long userId = evalGroupUser.getUserId(); | |
455 | + final Long postId = evalGroupUser.getPostId(); | |
456 | + final LocalDate newPostChangeDate = commonService.getNewPostChangeDate(userId, postId); | |
457 | + final LocalDate oldPostChangeDate = commonService.getOldPostChangeDate(userId, postId); | |
458 | + if (PublicUtil.isNotEmpty(newPostChangeDate)) { | |
459 | + //调岗时间大于阶段开始时间 阶段结束时间大于调岗时间(在阶段时间范围内调岗) | |
460 | + if (newPostChangeDate.compareTo(stage.getBeginTime()) > 0 && stage.getOverTime().compareTo(newPostChangeDate) > 0) { | |
461 | + evalGroupUser.setIgnored(Boolean.TRUE); | |
462 | + evalGroupUser.setIgnoreCauseDesc(KpiIgnoreCauseEnum.EVAL_MULTISTAGE_TIME_POST_CHANGE.getName()); | |
463 | + evalGroupUser.setIgnoreCause(KpiIgnoreCauseEnum.EVAL_MULTISTAGE_TIME_POST_CHANGE); | |
464 | + } | |
465 | + } | |
466 | + if (PublicUtil.isNotEmpty(oldPostChangeDate)) { | |
467 | + //调岗时间大于阶段开始时间 阶段结束时间大于调岗时间(在阶段时间范围内调岗) | |
468 | + if (oldPostChangeDate.compareTo(stage.getBeginTime()) > 0 && stage.getOverTime().compareTo(oldPostChangeDate) > 0) { | |
469 | + evalGroupUser.setIgnored(Boolean.TRUE); | |
470 | + evalGroupUser.setIgnoreCause(KpiIgnoreCauseEnum.EVAL_MULTISTAGE_TIME_POST_CHANGE); | |
471 | + evalGroupUser.setIgnoreCauseDesc(KpiIgnoreCauseEnum.EVAL_MULTISTAGE_TIME_POST_CHANGE.getName()); | |
472 | + } | |
473 | + } | |
474 | + final LocalDate leaveDate = evalGroupUser.getLeaveDate(); | |
475 | + if (PublicUtil.isNotEmpty(leaveDate)) { | |
476 | + //调岗时间大于阶段开始时间 阶段结束时间大于调岗时间(在阶段时间范围内调岗) | |
477 | + if (leaveDate.compareTo(stage.getBeginTime()) > 0 && stage.getOverTime().compareTo(leaveDate) > 0) { | |
478 | + evalGroupUser.setIgnored(Boolean.TRUE); | |
479 | + evalGroupUser.setIgnoreCause(KpiIgnoreCauseEnum.EVAL_MULTISTAGE_TIME_LEAVE); | |
480 | + evalGroupUser.setIgnoreCauseDesc(KpiIgnoreCauseEnum.EVAL_MULTISTAGE_TIME_LEAVE.getName()); | |
481 | + } | |
482 | + } | |
483 | + } | |
484 | + } | |
485 | + | |
486 | + /** | |
487 | + * 多阶段重置 是否参与考评字段 | |
488 | + * 张三3月18号离职,按照规则 15号之后离职需要参与绩效考核。第二阶段考评 3月11号 到 3月20号 ,这个期间张三不是所有时间都在考评范围内,所以不参与考评。 | |
489 | + */ | |
490 | + public void multiStageResetPoolInclusion(EvalGroupRank evalGroupRank, EvalGroupRankStage evalGroupRankStage, LocalDate dataDate) { | |
491 | + if (Boolean.TRUE.equals(evalGroupRank.getMultiStage())) { | |
492 | + List<EvalUserPool> stageEvalUserPools = evalUserPoolService.list(Wrappers.<EvalUserPool>lambdaQuery() | |
493 | + .eq(EvalUserPool::getEvalGroupRankStageId, evalGroupRankStage.getId()) | |
494 | + .eq(EvalUserPool::getMonthly, YearMonth.from(dataDate)) | |
495 | + .eq(EvalUserPool::getYn, Boolean.TRUE)); | |
496 | + for (EvalUserPool evalUserPool : stageEvalUserPools) { | |
497 | + evalUserPool.setInclusion(Boolean.FALSE); | |
498 | + evalUserPool.setReward(BigDecimal.ZERO); | |
499 | + evalUserPoolService.updateById(evalUserPool); | |
500 | + } | |
501 | + } | |
502 | + } | |
503 | + | |
504 | + public Set<Long> queryRepeatUserEvalIds(Long evalGroupRankStageId, LocalDate dataDate) { | |
505 | + List<EvalGroupUser> repeatUsers = evalGroupUserService.list(Wrappers.<EvalGroupUser>lambdaQuery() | |
506 | + .eq(EvalGroupUser::getEvalGroupRankStageId, evalGroupRankStageId) | |
507 | + .eq(EvalGroupUser::getDataDate, dataDate) | |
508 | + .eq(EvalGroupUser::getYn, Boolean.TRUE) | |
509 | + .select(EvalGroupUser::getId) | |
510 | + ); | |
511 | + return repeatUsers.stream().map(EvalGroupUser::getId).collect(Collectors.toSet()); | |
512 | + } | |
357 | 513 | |
514 | + public void initManageEvalUser(List<EvalGroupUser> manageEvalGroupUsers, Long evalGroupRankId, Long evalGroupRankStageId) { | |
515 | + if (PublicUtil.isEmpty(manageEvalGroupUsers)) { | |
516 | + return; | |
517 | + } | |
518 | + for (EvalGroupUser user : manageEvalGroupUsers) { | |
519 | + user.setEvalGroupRankId(evalGroupRankId); | |
520 | + user.setEvalGroupRankStageId(evalGroupRankStageId); | |
521 | + user.setEvalGroupId(-1L); | |
522 | + user.setEgc(""); | |
523 | + } | |
358 | 524 | } |
359 | 525 | |
360 | 526 | public void updatePoolOtherInfo(List<EvalGroupUser> users, EvalScopeEnum scopeType) { |
... | ... | @@ -363,12 +529,16 @@ public class EvalCalculateTaskService { |
363 | 529 | //忽略就不计算 |
364 | 530 | Boolean inclusion = Boolean.TRUE.equals(user.getIgnored()) ? Boolean.FALSE : Boolean.TRUE; |
365 | 531 | userPool.setInclusion(inclusion); |
532 | + //不纳入计算,奖惩清空 | |
533 | + if (Boolean.FALSE.equals(inclusion)) { | |
534 | + userPool.setReward(BigDecimal.ZERO); | |
535 | + } | |
366 | 536 | evalUserPoolService.updateById(userPool); |
367 | 537 | } |
368 | 538 | } |
369 | 539 | |
370 | - public void cacheStageIndicator(final Long evalCalcId, final Long evalGroupRankId, final Set<Long> evalGroupIds, Boolean realTimeCalc, final LocalDate localDate) { | |
371 | - String json = JSONObject.toJSONString(new EvalExtractStageIndicatorBO(evalCalcId, evalGroupRankId, evalGroupIds, localDate, realTimeCalc)); | |
540 | + public void cacheStageIndicator(final Long evalCalcId, final Long evalGroupRankId, Boolean realTimeCalc, final LocalDate localDate) { | |
541 | + String json = JSONObject.toJSONString(new EvalExtractStageIndicatorBO(evalCalcId, evalGroupRankId, localDate, realTimeCalc)); | |
372 | 542 | stringRedisTemplate.opsForSet().add(evalCalculationVal.getCacheSendStageIndicatorMQ(), json); |
373 | 543 | } |
374 | 544 | |
... | ... | @@ -397,6 +567,7 @@ public class EvalCalculateTaskService { |
397 | 567 | |
398 | 568 | public void extractStageIndicator(EvalExtractStageIndicatorBO stageIndicatorBO) { |
399 | 569 | final Long evalGroupRankId = stageIndicatorBO.getEvalGroupRankId(); |
570 | + final Long evalCalcId = stageIndicatorBO.getEvalCalcId(); | |
400 | 571 | final LocalDate dataDate = stageIndicatorBO.getLocalDate(); |
401 | 572 | final Boolean realTimeCalc = stageIndicatorBO.getRealTimeCalc(); |
402 | 573 | |
... | ... | @@ -418,7 +589,7 @@ public class EvalCalculateTaskService { |
418 | 589 | if (PublicUtil.isEmpty(sysIndicatorCodes)) { |
419 | 590 | evalCalc.setStatus(EvalCalcStatusEnum.CALC_EVAL); |
420 | 591 | evalCalcService.updateById(evalCalc); |
421 | - cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), new HashSet<>(evalCalc.getEvalGroupIds()), evalCalc.getCalcDate()); | |
592 | + cacheCalcGroupIds(evalCalcId, evalCalc.getEvalGroupRankId(), evalCalc.getCalcDate()); | |
422 | 593 | platformTransactionManager.commit(status); |
423 | 594 | return; |
424 | 595 | } |
... | ... | @@ -428,14 +599,15 @@ public class EvalCalculateTaskService { |
428 | 599 | //保存发送记录,构建发送mq |
429 | 600 | EvalRankReportBO evalRankReportBO = this.getReportObj(evalGroupRank, dataDate, evalGroupRankStages); |
430 | 601 | for (String sysIndicatorCode : sysIndicatorCodes) { |
431 | - stageReportNoticeMQS.addAll(this.sendNotice(evalRankReportBO, evalGroupRankStages, sysIndicatorCode, dataDate, evalCalc.getId())); | |
602 | + stageReportNoticeMQS.addAll(this.sendNotice(evalRankReportBO, evalGroupRankStages, sysIndicatorCode, dataDate, evalCalcId)); | |
603 | + stageReportNoticeMQS.addAll(this.sendLeaveStaffNotice(evalRankReportBO, evalGroupRankStages, sysIndicatorCode, dataDate, evalCalcId)); | |
432 | 604 | |
433 | 605 | //关联指标也发MQ |
434 | 606 | Indicators indicators = indicatorsService.queryByCode(sysIndicatorCode, Boolean.FALSE); |
435 | 607 | if (PublicUtil.isNotEmpty(indicators) && PublicUtil.isNotEmpty(indicators.getOriginIndicatorCode())) { |
436 | 608 | final String originIndicatorCode = indicators.getOriginIndicatorCode(); |
437 | - stageReportNoticeMQS.addAll(this.sendNotice(evalRankReportBO, evalGroupRankStages, | |
438 | - originIndicatorCode, dataDate, evalCalc.getId())); | |
609 | + stageReportNoticeMQS.addAll(this.sendNotice(evalRankReportBO, evalGroupRankStages, originIndicatorCode, dataDate, evalCalcId)); | |
610 | + stageReportNoticeMQS.addAll(this.sendLeaveStaffNotice(evalRankReportBO, evalGroupRankStages, originIndicatorCode, dataDate, evalCalcId)); | |
439 | 611 | } |
440 | 612 | } |
441 | 613 | platformTransactionManager.commit(status); |
... | ... | @@ -512,6 +684,82 @@ public class EvalCalculateTaskService { |
512 | 684 | return reportNoticeMQS; |
513 | 685 | } |
514 | 686 | |
687 | + /** | |
688 | + * 发送绩效数据上报mq | |
689 | + * | |
690 | + * @param dataDate | |
691 | + */ | |
692 | + public List<KpiStageReportNoticeMQ> sendLeaveStaffNotice(EvalRankReportBO evalRankReportBO, List<EffectEvalStageBO> stages, String indicatorCode, final LocalDate dataDate, final Long evalCalcId) { | |
693 | + final Date monthlyEndTime = DateUtil.localDateTime2Date(YearMonth.from(dataDate).atEndOfMonth().atTime(23, 59, 59)); | |
694 | + final Date monthlyStartTime = DateUtil.localDateTime2Date(evalRankReportBO.getWholeBeginTime().atTime(0, 0, 1)); | |
695 | + List<KpiStageReportNoticeMQ> reportNoticeMQS = new ArrayList<>(); | |
696 | + | |
697 | + for (EffectEvalStageBO evalStageBO : stages) { | |
698 | + final LocalDate stageEndTime = evalStageBO.getStageEndTime().isAfter(dataDate) | |
699 | + ? dataDate : evalStageBO.getStageEndTime(); | |
700 | + | |
701 | + final Long evalGroupRankStageId = evalStageBO.getEvalGroupRankStageId(); | |
702 | + List<EvalUserPool> userPools = evalUserPoolService.getLeaveOrChangePostPools(evalGroupRankStageId, stageEndTime); | |
703 | + if (PublicUtil.isEmpty(userPools)) { | |
704 | + log.info("阶段没有离职调岗员工:{}", JSON.toJSONString(evalStageBO)); | |
705 | + continue; | |
706 | + } | |
707 | + | |
708 | + for (EvalUserPool userPool : userPools) { | |
709 | + final LocalDate staffLastDate = userPool.getDataDate(); | |
710 | + //阶段时间、阶段累计时间 | |
711 | + //员工离岗时间 与 阶段结束时间判断 | |
712 | + final LocalDate staffStageEndTime = staffLastDate.compareTo(stageEndTime) > 0 | |
713 | + ? stageEndTime : staffLastDate; | |
714 | + final Date staffStageEndDateTime = DateUtil.localDateTime2Date(staffStageEndTime.atTime(23, 59, 59)); | |
715 | + | |
716 | + KpiStageMqLog mqLog = this.createLeaveStaffMqLog(userPool, evalRankReportBO, evalStageBO, indicatorCode, evalCalcId, staffStageEndTime); | |
717 | + KpiStageReportNoticeMQ noticeMQ = KpiStageReportNoticeMQ.builder() | |
718 | + .indicatorCode(mqLog.getIndicatorCode()) | |
719 | + .shopIds(new ArrayList<Long>(){{add(userPool.getShopId());}}) | |
720 | + .userIds(new ArrayList<Long>(){{add(userPool.getUserId());}}) | |
721 | + .groupId(mqLog.getGroupId()) | |
722 | + .build(); | |
723 | + List<KpiStageReportNoticeMQ.ReportDate> reportStages = new ArrayList<>(); | |
724 | + KpiStageReportNoticeMQ.ReportDate reportStage = noticeMQ.new ReportDate(IndicatorReportTypeEnum.STAGE.getValue(), | |
725 | + DateUtil.localDateTime2Date(evalStageBO.getStageBeginTime().atTime(0, 0, 1)), | |
726 | + staffStageEndDateTime, | |
727 | + DateUtil.localDateTime2Date(evalStageBO.getStageEndTime().atTime(23, 59, 59)) | |
728 | + ); | |
729 | + reportStages.add(reportStage); | |
730 | + mqLog.setStatus(KpiStageMqLogStatusEnum.WAIT_REPORT); | |
731 | + mqLog.setStageTimeStr(JSON.toJSONString(reportStages)); | |
732 | + kpiStageMqLogService.save(mqLog); | |
733 | + KpiStageReportNoticeMQ.ReportDate monthly = noticeMQ.new ReportDate(IndicatorReportTypeEnum.WHOLE.getValue(), | |
734 | + monthlyStartTime, | |
735 | + staffStageEndDateTime, | |
736 | + monthlyEndTime | |
737 | + ); | |
738 | + noticeMQ.setWhole(monthly); | |
739 | + noticeMQ.setStages(reportStages); | |
740 | + noticeMQ.setUid(mqLog.getId().toString()); | |
741 | + | |
742 | + reportNoticeMQS.add(noticeMQ); | |
743 | + //1. 初始状态放入 | |
744 | + stringRedisTemplate.opsForHash().put( | |
745 | + evalCalculationVal.getMqCodeLogStatusKey(mqLog.getEvalCalcId()), | |
746 | + mqLog.getIndicatorCode(), | |
747 | + String.valueOf(mqLog.getStatus().getValue()) | |
748 | + ); | |
749 | + //设置过期 | |
750 | + stringRedisTemplate.expire( | |
751 | + evalCalculationVal.getMqCodeLogStatusKey(mqLog.getEvalCalcId()), | |
752 | + 6L, TimeUnit.HOURS); | |
753 | + log.info("1. 初始状态放入 redis K: {},HK: {},HV: {},24H后过期", | |
754 | + evalCalculationVal.getMqCodeLogStatusKey(mqLog.getEvalCalcId()), | |
755 | + mqLog.getIndicatorCode(), | |
756 | + mqLog.getStatus().getValue() | |
757 | + ); | |
758 | + } | |
759 | + } | |
760 | + return reportNoticeMQS; | |
761 | + } | |
762 | + | |
515 | 763 | public KpiStageMqLog createMqLog(EvalRankReportBO evalRankReportBO, EffectEvalStageBO stageBO, String indicatorCode, Long evalCalcId, LocalDate dataDate) { |
516 | 764 | final LocalDate wholeBeginTime = evalRankReportBO.getWholeBeginTime(); |
517 | 765 | final Long groupId = stageBO.getGroupId(); |
... | ... | @@ -528,6 +776,22 @@ public class EvalCalculateTaskService { |
528 | 776 | return mqLog; |
529 | 777 | } |
530 | 778 | |
779 | + public KpiStageMqLog createLeaveStaffMqLog(EvalUserPool evalUserPool, EvalRankReportBO evalRankReportBO, EffectEvalStageBO stageBO, String indicatorCode, Long evalCalcId, LocalDate dataDate) { | |
780 | + final LocalDate wholeBeginTime = evalRankReportBO.getWholeBeginTime(); | |
781 | + final Long groupId = stageBO.getGroupId(); | |
782 | + | |
783 | + KpiStageMqLog mqLog = new KpiStageMqLog(); | |
784 | + mqLog.setIndicatorCode(indicatorCode); | |
785 | + mqLog.setWholeBeginTime(wholeBeginTime); | |
786 | + mqLog.setWholeEndTime(dataDate); | |
787 | + mqLog.setEvalCalcId(evalCalcId); | |
788 | + mqLog.setDataDate(dataDate); | |
789 | + mqLog.setGroupId(groupId); | |
790 | + mqLog.setUserIds(new ArrayList<Long>(){{add(evalUserPool.getUserId());}}); | |
791 | + mqLog.setShopIds(new ArrayList<Long>(){{add(evalUserPool.getShopId());}}); | |
792 | + return mqLog; | |
793 | + } | |
794 | + | |
531 | 795 | public void checkExtractStageIndicatorTimeOut() { |
532 | 796 | Lock lock = distributedLocker.lock(evalCalculationVal.getCheckExtractStageTimeOutKey()); |
533 | 797 | if (!((RLock) lock).isLocked()) { |
... | ... | @@ -543,7 +807,7 @@ public class EvalCalculateTaskService { |
543 | 807 | .eq(EvalCalc::getYn, Boolean.TRUE) |
544 | 808 | ); |
545 | 809 | for (EvalCalc evalCalc : evalCalcs) { |
546 | - cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), new HashSet<>(evalCalc.getEvalGroupIds()), evalCalc.getCalcDate()); | |
810 | + cacheCalcGroupIds(evalCalc.getId(), evalCalc.getEvalGroupRankId(), evalCalc.getCalcDate()); | |
547 | 811 | evalCalcService.modifyStatus(evalCalc.getId(), EvalCalcStatusEnum.CALC_EVAL); |
548 | 812 | stringRedisTemplate.delete(evalCalculationVal.getMqCodeLogStatusKey(evalCalc.getId())); |
549 | 813 | } |
... | ... | @@ -555,8 +819,8 @@ public class EvalCalculateTaskService { |
555 | 819 | |
556 | 820 | } |
557 | 821 | |
558 | - private void cacheCalcGroupIds(final Long evalCalcId, final Long evalGroupRankId, final Set<Long> evalGroupIds, final LocalDate localDate) { | |
559 | - String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalcId, evalGroupRankId, evalGroupIds, localDate)); | |
822 | + private void cacheCalcGroupIds(final Long evalCalcId, final Long evalGroupRankId, final LocalDate localDate) { | |
823 | + String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalcId, evalGroupRankId, localDate)); | |
560 | 824 | stringRedisTemplate.opsForSet().add(evalCalculationVal.getCacheCalculation(), json); |
561 | 825 | } |
562 | 826 | |
... | ... | @@ -599,7 +863,7 @@ public class EvalCalculateTaskService { |
599 | 863 | evalCalc.setStatus(EvalCalcStatusEnum.CALC_EVAL); |
600 | 864 | evalCalcService.save(evalCalc); |
601 | 865 | evalCalcs.add(evalCalc); |
602 | - String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalc.getId(), evalGroupRankId, evalGroupIds, localDate)); | |
866 | + String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalc.getId(), evalGroupRankId, localDate)); | |
603 | 867 | stringRedisTemplate.opsForSet().add(evalCalculationVal.getCacheCalculation(), json); |
604 | 868 | } |
605 | 869 | if (Boolean.TRUE.equals(distReward)) { |
... | ... | @@ -646,7 +910,7 @@ public class EvalCalculateTaskService { |
646 | 910 | evalCalc.setYn(Boolean.TRUE); |
647 | 911 | evalCalc.setStatus(EvalCalcStatusEnum.CALC_EVAL); |
648 | 912 | evalCalcService.save(evalCalc); |
649 | - String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalc.getId(), evalGroupRankId, evalGroupIds, localDate)); | |
913 | + String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalc.getId(), evalGroupRankId, localDate)); | |
650 | 914 | stringRedisTemplate.opsForSet().add(evalCalculationVal.getCacheCalculation(), json); |
651 | 915 | } |
652 | 916 | |
... | ... | @@ -817,6 +1081,14 @@ public class EvalCalculateTaskService { |
817 | 1081 | add(LocalDate.now().minusDays(2)); |
818 | 1082 | add(LocalDate.now().minusDays(3)); |
819 | 1083 | add(LocalDate.now().minusDays(4)); |
1084 | + add(LocalDate.now().minusDays(5)); | |
1085 | + add(LocalDate.now().minusDays(6)); | |
1086 | + add(LocalDate.now().minusDays(7)); | |
1087 | + add(LocalDate.now().minusDays(8)); | |
1088 | + add(LocalDate.now().minusDays(9)); | |
1089 | + add(LocalDate.now().minusDays(10)); | |
1090 | + add(LocalDate.now().minusDays(11)); | |
1091 | + add(LocalDate.now().minusDays(12)); | |
820 | 1092 | }}; |
821 | 1093 | return calcDates; |
822 | 1094 | } | ... | ... |
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 | |
... | ... | @@ -269,6 +271,9 @@ public class EvalGroupUserBizService { |
269 | 271 | if (PublicUtil.isNotEmpty(now)) { |
270 | 272 | evalGroupUser.setDataDate(now); |
271 | 273 | } |
274 | + if (PublicUtil.isNotEmpty(staff.getLeaveDate())) { | |
275 | + evalGroupUser.setLeaveDate(staff.getLeaveDate()); | |
276 | + } | |
272 | 277 | return evalGroupUser; |
273 | 278 | } |
274 | 279 | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/eval/EvalPoolCommonService.java
... | ... | @@ -180,6 +180,69 @@ public class EvalPoolCommonService { |
180 | 180 | return userPool; |
181 | 181 | } |
182 | 182 | |
183 | +// @Transactional(rollbackFor = Exception.class) | |
184 | + public void createUserPools(List<EvalGroupUser> users, EvalScopeEnum scopeType) { | |
185 | + for (EvalGroupUser user : Optional.ofNullable(users).orElse(new ArrayList<>())) { | |
186 | + this.createUserPool(user, scopeType); | |
187 | + } | |
188 | + } | |
189 | + | |
190 | + /** | |
191 | + * 查询薪酬池 | |
192 | + * | |
193 | + * @param user | |
194 | + * @return | |
195 | + */ | |
196 | +// @Transactional(rollbackFor = Exception.class) | |
197 | + public void createUserPool(EvalGroupUser user, EvalScopeEnum scopeType) { | |
198 | + EvalPoolBusinessTypeEnum businessType = EvalScopeEnum.MANAGEMENT.equals(scopeType) | |
199 | + ? EvalPoolBusinessTypeEnum.REWARD : EvalPoolBusinessTypeEnum.SCORE_REWARD; | |
200 | + | |
201 | + EvalUserPool evalUserPool = evalUserPoolService.getOne(Wrappers.<EvalUserPool>lambdaQuery() | |
202 | + .eq(EvalUserPool::getEvalGroupRankStageId, user.getEvalGroupRankStageId()) | |
203 | + .eq(EvalUserPool::getUserId, user.getUserId()) | |
204 | + .eq(EvalUserPool::getPostId, user.getPostId()) | |
205 | + .eq(EvalUserPool::getShopId, user.getShopId()) | |
206 | + .eq(EvalUserPool::getBusinessType, businessType) | |
207 | + .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate())) | |
208 | + .eq(EvalUserPool::getYn, Boolean.TRUE) | |
209 | + , Boolean.FALSE); | |
210 | + if (PublicUtil.isNotEmpty(evalUserPool)) { | |
211 | + Boolean inclusion = Boolean.TRUE.equals(user.getIgnored()) ? Boolean.FALSE : Boolean.TRUE; | |
212 | + evalUserPool.setInclusion(inclusion); | |
213 | + //不纳入计算,奖惩清空 | |
214 | + if (Boolean.FALSE.equals(inclusion)) { | |
215 | + evalUserPool.setReward(BigDecimal.ZERO); | |
216 | + evalUserPool.setRank(null); | |
217 | + } | |
218 | + evalUserPool.setDataDate(user.getDataDate()); | |
219 | + evalUserPoolService.updateById(evalUserPool); | |
220 | + return; | |
221 | + } | |
222 | + //同一个考评组的 调岗员工 修改调岗数据(调岗同岗位,合并数据,不同岗位,两条数据) | |
223 | + evalUserPool = evalUserPoolService.getOne(Wrappers.<EvalUserPool>lambdaQuery() | |
224 | + .eq(EvalUserPool::getEvalGroupRankStageId, user.getEvalGroupRankStageId()) | |
225 | + .eq(EvalUserPool::getEvalGroupId, user.getEvalGroupId()) | |
226 | + .eq(EvalUserPool::getUserId, user.getUserId()) | |
227 | + .eq(EvalUserPool::getPostId, user.getPostId()) | |
228 | + .eq(EvalUserPool::getBusinessType, businessType) | |
229 | + .eq(EvalUserPool::getMonthly, YearMonth.from(user.getDataDate())) | |
230 | + .eq(EvalUserPool::getYn, Boolean.TRUE) | |
231 | + , Boolean.FALSE); | |
232 | + if (PublicUtil.isNotEmpty(evalUserPool)) { | |
233 | + evalUserPool.setPostId(user.getPostId()); | |
234 | + evalUserPool.setPostName(user.getPostName()); | |
235 | + evalUserPool.setShopId(user.getShopId()); | |
236 | + evalUserPool.setShopName(user.getShopName()); | |
237 | + if (PublicUtil.isNotEmpty(user.getEgc())) { | |
238 | + evalUserPool.setEgc(user.getEgc()); | |
239 | + } | |
240 | + evalUserPoolService.updateById(evalUserPool); | |
241 | + return; | |
242 | + } | |
243 | + this.createUserPoolData(user, scopeType); | |
244 | + } | |
245 | + | |
183 | 246 | /** |
184 | 247 | * 获取员工社保公积金门店 |
185 | 248 | * | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiPoolCommonService.java
... | ... | @@ -89,7 +89,7 @@ public class KpiPoolCommonService { |
89 | 89 | .eq(KpiPool::getYn, Boolean.TRUE) |
90 | 90 | , Boolean.FALSE); |
91 | 91 | if (PublicUtil.isEmpty(kpiPool)) { |
92 | - log.error("绩效数据不存在,用户:{}", JSON.toJSONString(user)); | |
92 | +// log.error("绩效数据不存在,用户:{}", JSON.toJSONString(user)); | |
93 | 93 | // throw new BusinessException("用户[" + user.getUserId() + "]的绩效数据不存在"); |
94 | 94 | } |
95 | 95 | return Optional.ofNullable(kpiPool); |
... | ... | @@ -110,7 +110,7 @@ public class KpiPoolCommonService { |
110 | 110 | .eq(KpiPool::getYn, Boolean.TRUE) |
111 | 111 | , Boolean.FALSE); |
112 | 112 | if (PublicUtil.isEmpty(kpiPool)) { |
113 | - log.error("绩效数据不存在,薪酬池:{}", JSON.toJSONString(pool)); | |
113 | +// log.error("绩效数据不存在,薪酬池:{}", JSON.toJSONString(pool)); | |
114 | 114 | // throw new BusinessException("用户[" + pool.getUserId() + "]的绩效数据不存在"); |
115 | 115 | } |
116 | 116 | return kpiPool; |
... | ... | @@ -128,7 +128,7 @@ public class KpiPoolCommonService { |
128 | 128 | .eq(KpiPool::getYn, Boolean.TRUE) |
129 | 129 | , Boolean.FALSE); |
130 | 130 | if (PublicUtil.isEmpty(kpiPool)) { |
131 | - log.error("绩效数据不存在,薪酬池:{}", JSON.toJSONString(pool)); | |
131 | +// log.error("绩效数据不存在,薪酬池:{}", JSON.toJSONString(pool)); | |
132 | 132 | // throw new BusinessException("用户[" + pool.getUserId() + "]的绩效数据不存在"); |
133 | 133 | } |
134 | 134 | return kpiPool; | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/biz/kpi/KpiStageIndicatorBizService.java
... | ... | @@ -102,6 +102,10 @@ public class KpiStageIndicatorBizService { |
102 | 102 | final Long evalCalcId = kpiStageMqLog.getEvalCalcId(); |
103 | 103 | |
104 | 104 | EvalCalc evalCalc = evalCalcService.getById(evalCalcId); |
105 | + if (PublicUtil.isEmpty(evalCalc) || PublicUtil.isEmpty(evalCalc.getStatus())) { | |
106 | + log.info("确认完成阶段数据上报 evalCalc为空,evalCalcId:{}", evalCalcId); | |
107 | + return Message.success(); | |
108 | + } | |
105 | 109 | //正在收集数据 |
106 | 110 | if (EvalCalcStatusEnum.COLLECT_STAGE_DATA.equals(evalCalc.getStatus())) { |
107 | 111 | //在确认最晚时间之内 完成,其他业务系统可能还没确认 |
... | ... | @@ -141,7 +145,7 @@ public class KpiStageIndicatorBizService { |
141 | 145 | log.info("当前状态: {}, 无需重复处理!",evalCalc1.getStatus().getValue()); |
142 | 146 | }else { |
143 | 147 | evalCalcService.modifyStatus(evalCalcId, EvalCalcStatusEnum.CALC_EVAL); |
144 | - cacheCalcGroupIds(evalCalcId, evalCalc.getEvalGroupRankId(), new HashSet<>(evalCalc.getEvalGroupIds()), evalCalc.getCalcDate()); | |
148 | + cacheCalcGroupIds(evalCalcId, evalCalc.getEvalGroupRankId(), evalCalc.getCalcDate()); | |
145 | 149 | } |
146 | 150 | stringRedisTemplate.delete(evalCalculationVal.getMqCodeLogStatusKey(kpiStageMqLog.getEvalCalcId())); |
147 | 151 | } |
... | ... | @@ -150,8 +154,8 @@ public class KpiStageIndicatorBizService { |
150 | 154 | return Message.success(); |
151 | 155 | } |
152 | 156 | |
153 | - private void cacheCalcGroupIds(final Long evalCalcId, final Long evalGroupRankId, final Set<Long> evalGroupIds, final LocalDate localDate) { | |
154 | - String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalcId, evalGroupRankId, evalGroupIds, localDate)); | |
157 | + private void cacheCalcGroupIds(final Long evalCalcId, final Long evalGroupRankId, final LocalDate localDate) { | |
158 | + String json = JSONObject.toJSONString(new EvalGroupCalculableBO(evalCalcId, evalGroupRankId, localDate)); | |
155 | 159 | stringRedisTemplate.opsForSet().add(evalCalculationVal.getCacheCalculation(), json); |
156 | 160 | } |
157 | 161 | ... | ... |
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/EvalUserPoolService.java
... | ... | @@ -7,6 +7,7 @@ import cn.fw.morax.domain.enums.EvalScopeEnum; |
7 | 7 | import cn.fw.morax.domain.vo.eval.EvalUserPoolVO; |
8 | 8 | import com.baomidou.mybatisplus.extension.service.IService; |
9 | 9 | |
10 | +import java.time.LocalDate; | |
10 | 11 | import java.time.YearMonth; |
11 | 12 | import java.util.List; |
12 | 13 | |
... | ... | @@ -37,4 +38,12 @@ public interface EvalUserPoolService extends IService<EvalUserPool> { |
37 | 38 | List<EvalUserPool> getPools(Long evalGroupRankStageId, YearMonth monthly); |
38 | 39 | |
39 | 40 | List<EvalUserPool> getRankPools(Long evalGroupRankStageId, YearMonth monthly, EvalScopeEnum scopeType); |
41 | + | |
42 | + /** | |
43 | + * 获取离职或调岗人员 | |
44 | + * @param evalGroupRankStageId | |
45 | + * @param monthly | |
46 | + * @return | |
47 | + */ | |
48 | + List<EvalUserPool> getLeaveOrChangePostPools(Long evalGroupRankStageId, LocalDate stageEndTime); | |
40 | 49 | } | ... | ... |
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) | ... | ... |
fw-morax-service/src/main/java/cn/fw/morax/service/data/eval/impl/EvalUserPoolServiceImpl.java
... | ... | @@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
14 | 14 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
15 | 15 | import org.springframework.stereotype.Service; |
16 | 16 | |
17 | +import java.time.LocalDate; | |
17 | 18 | import java.time.YearMonth; |
18 | 19 | import java.util.ArrayList; |
19 | 20 | import java.util.List; |
... | ... | @@ -87,4 +88,21 @@ public class EvalUserPoolServiceImpl extends ServiceImpl<EvalUserPoolDao, EvalUs |
87 | 88 | ); |
88 | 89 | return pools; |
89 | 90 | } |
91 | + | |
92 | + @Override | |
93 | + public List<EvalUserPool> getLeaveOrChangePostPools(Long evalGroupRankStageId, LocalDate stageEndTime) { | |
94 | + if (PublicUtil.isEmpty(evalGroupRankStageId)) { | |
95 | + return new ArrayList<>(); | |
96 | + } | |
97 | + YearMonth monthly = YearMonth.from(stageEndTime); | |
98 | + //在考评期间,但结束日期不是阶段结束日期 | |
99 | + List<EvalUserPool> pools = this.list(Wrappers.<EvalUserPool>lambdaQuery() | |
100 | + .in(EvalUserPool::getEvalGroupRankStageId, evalGroupRankStageId) | |
101 | + .eq(EvalUserPool::getMonthly, monthly) | |
102 | + .ne(EvalUserPool::getDataDate, stageEndTime) | |
103 | + .eq(EvalUserPool::getBusinessType, EvalPoolBusinessTypeEnum.SCORE_REWARD) | |
104 | + .eq(EvalUserPool::getYn, Boolean.TRUE) | |
105 | + ); | |
106 | + return pools; | |
107 | + } | |
90 | 108 | } | ... | ... |